実行するときに渡す
ansible-playbook -i hosts.yml site.yml -u (username) --private-key (pass)
inventoryに書いておく
all: hosts: www1.example.com: www2.example.com: vars: ansible_user: (username) ansible_ssh_private_key_file: (pass)
せや!面倒だしパスワード認証のまま世界に晒せばいいんや!
実行するときに渡す
ansible-playbook -i hosts.yml site.yml -u (username) --private-key (pass)
inventoryに書いておく
all: hosts: www1.example.com: www2.example.com: vars: ansible_user: (username) ansible_ssh_private_key_file: (pass)
せや!面倒だしパスワード認証のまま世界に晒せばいいんや!
#include <sys/types.h> #include <unitstd.h> #include <sys.wait.h>
waitは無くてもいいけどあると便利
int pid; pid = fork(); if (pid!=0){ ~親プロセスの処理~ }else if(pid==0){ ~子プロセスの処理~ }else{ ~エラー処理~ }
パイプが一番楽?
子→親で送るならたぶんこう
int pid; pid = fork(); int pipes[2]; int buf[1]; int data; if(pipe(pipes)==-1){ ~エラー処理~ } if (pid!=0){ ~親プロセスの処理~ read(pipes[0], buf, sizeof(int)); }else if(pid==0){ ~子プロセスの処理~ write(pipes[1], data, sizeof(data)) }else{ ~エラー処理~ }
親→子もするならそれ用にパイプ追加で作っておく.プロセスをたくさん作るならパイプもたくさん作ってたくさんread/writeすればいい.同じパイプを共有するとぶつかったりして面倒.
マルチスレッド?メモリ管理面倒くさすぎて嫌じゃぁ
グローバルIPがもらえないアパート回線でも何とかして自宅鯖に外部からアクセスできるようにしたいお話.
外部のグローバルIP持ってるマシンと自宅鯖をVPNで繋いで通信中継させてなんとかする.
図にはnginx UDP proxyって書いたけどTCPでもおk.
今回はAzure Studentで実質無料で使えたからAzureのVMにした.
(2022/12/25 WebARENAの1GBでもできた)
通信中継だけなら大した性能は要らないし,さくらでもGMOでもWebARENAでも安いところを選べばヨシ!
FUJITSU PRIMERGY TX1330 M1
Xeon E3-1220v3
DDR3 8GB
AlmaLinux8
悲しきアパート回線故グローバルIPなし
Standard B1ls
CentOS 7.9.2009
( ^ν^)おかしい…CentOS7はすでにサポート切れのはずでは…?
そのうち更新するよそのうち→WebARENA移行に伴いRocky8.4に更新
自分のメモ見ながらこれ書いてたんですけどメモにsudo書いたり書かなかったりしてるせいでこの記事もsudo書いたり書かなかったりになってます.
適宜いい感じにしてください.
B1lsはメモリ少なすぎてdnf update
ないしyum update
ですら普通にメモリ不足で死ぬのでスワップを確保すること.
yum updateだのなんだのかんだのって感じのテンプレ初期設定を済ませる.
したらばSoftEtherのセットアップ
基本的に↓これ準拠になる.若干違うけど.
7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト
SoftEther VPN Server → Linux → Intel x64 / AMD64 (64bit)
でVPNServerを落としておく.ついでに SoftEther VPN Client も同様に.あとSoftEther VPN Server Manager for Windowsも.
したら/usr/local
にどちらも展開.必要に応じてgccとかコンパイラ入れてmake
.
あとそれぞれのvpncmdとvpnserverとvpnclientをchmodで700にしておく
そしたらそれぞれサービス化する.さっきのリンク先ではinit.dでやってるけど今時らしくsystemdでやったほうがいい気がするので
vi /etc/systemd/system/vpnserver.service
[Unit] Description=SoftEther VPN Server After=network.target [Service] Type=forking ExecStart=/usr/local/vpnserver/vpnserver start ExecStop=/usr/local/vpnserver/vpnserver stop [Install] WantedBy=multi-user.target
vi /etc/systemd/system/vpnclient.service
[Unit] Description=SoftEther VPN Client After=network.target network-online.target [Service] ExecStart=/usr/local/vpnclient/vpnclient start ExecStop=/usr/local/vpnclient/vpnclient stop Type=forking RestartSec=3s [Install] WantedBy=multi-user.target
こんな感じで.そしたらsystemctl start vpnserver
とsystemctl start vpnclient
する.
ついでにfirewall-cmdとかAzurePortalのネットワークの設定とかからTCP443とかいい感じのポートを開けておく(VPN接続用)
TCP443番でいいならこんな感じで
firewall-cmd --add-service=https --zone=public --permanent firewall-cmd --reload firewall-cmd --list-service firewall-cmd --list-port
他ポートなら (ex, TCP4444)
firewall-cmd --add-port=4444/tcp --zone=public --permanent firewall-cmd --reload firewall-cmd --list-service firewall-cmd --list-port
そしたらSoftEther VPN Server Manager for Windowsで接続,パスワードとかを設定して仮想ハブ作ってAzure側のユーザと自宅鯖側のユーザ作って「仮想NAT及び仮想DHCP機能」からSecureNAT機能を有効にする.仮想ホストのIPアドレスとかデフォルトゲートウェイとかもいい感じにしておく.DHCPは無くてもいい.少なくともこの中では使わない. エクストリーム適当にやってこんな感じ.ここまででいったんVPN Serverの作業は終わり.
/usr/local/vpnclient
から./vpncmd
して 2->空Enter,あとは
niccreate accountcreate accountpasswordset
をそれぞれやって仮想nic作って接続設定を作る.そしたらaccountconnect
で接続できるか確認.Connected
になればおk.ならなかったら接続設定を再確認.あと起動時に自動接続したいならaccountstartup
そしたら仮想nicにIPアドレスその他を設定する.なんかそのままだとnmcliで操作できないけどipでアドレス与えてやるとなんか勝手にconnectionが作られる
ip address add dev [仮想nic名] 192.168.30.2/24
こんな感じに.ipだと再起動したらアドレス消えちゃうので決して電源を落とさないでください()
あとnmcliとか使ってネットマスクとかdnsサーバを設定する.
アドレス設定出来たらAzure側での作業一旦終了.
Azure側と同じ感じでvpnclientを設定して接続.そしてアドレスその他設定.
ip address add dev [仮想nic名] 192.168.30.3/24
あとは動かしたいサービス起動したりポート開けたりそういう作業をやっておく.
ここまでやったら自宅鯖とAzureはVPNで繋がってるはずだからpingとか通じるか見ておく.
あとポートが開いているかとかの確認にはncコマンドが便利.
これで自宅鯖側終了.またAzureを操作する.
通信を中継するためのnginxをセットアップする.そのためには--with-stream
をつけてmakeしないといけない.
sudo yum install pcre-devel zlib-devel wget http://nginx.org/download/nginx-1.21.6.tar.gz ※サイト見て更新日確認して一番新しいやつ選ぶ tar zxvf nginx-1.21.6.tar.gz cd nginx-1.21.6 ./configure --with-stream --sbin-path=/usr/sbin/nginx --prefix=/etc/nginx ※error出たら都度対応 make && sudo make install
そしたらnginxもサービス化する.
vi /usr/lib/systemd/system/nginx.service
[Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
そしたらnginx.confを色々する.
nginx -t sudo rm /etc/nginx/conf/nginx.conf sudo vi /etc/nginx/conf/nginx.conf
worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; } stream { upstream mcserver { server 192.168.30.3:25565; } server { listen 25565; proxy_pass mcserver; } }
そして動かす.
nginx -t sudo systemctl daemon-reload sudo systemctl enable nginx sudo systemctl start nginx sudo systemctl status nginx
これで動く.nginx -t
で文句言われたらnginx.confを修正する.今回のnginx.confはJava版マイクラを想定してTCP25565番ポートに来た通信を192.168.30.3のTCP25565番ポートに転送している.これが統合版だとUDPの19132番になるから,
worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; } stream { upstream mcserver { server 192.168.30.3:19132; } server { listen 19132 udp; proxy_pass mcserver; } }
となる.
systemctl status nginx
見るとFailed to parse PID from file /var/run/nginx.pid: Invalid argument
って出るけどなんか動いてるしヨシ!
ここまでやればAzureのVMで通信受けたらVPN通して自宅サーバに送って結果を返す動きはできるはず.
もしかするとデフォルトゲートウェイの設定がすこし変になっていると思うから必要に応じて確認&修正.(勝手に192.168.30.1がデフォルトになっててインターネットに繋がれなくなってたりする)
あとはまぁ頑張ってください.
AzureでB1lsでCentos7.9使ったらメモリ足りなさ過ぎてyum updateすら出来なかったからそれを何とかする話
これで1GB,必要に応じて増やす.
dd if=/dev/zero of=/swapfile bs=1M count=1024 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
あとはfstabに書いておく
vi /etc/fstab /swapfile swap swap defaults 0 0
free -h
とか見てスワップ領域が確保されていることを確認する.再起動しても確保されてるか確認する.
再起動したらダメだったときはfstabの書式確認.
2022/12/24 chmod 600を忘れてたので追記
なんかこう色々あってパスワード付きPDFファイルのパスワードを解析してみることになったのでその時のあれこれ.
雑に言えば
1. hashcatとJown the Ripperを用意する
2. JownでPDFからハッシュを抜き取る
3. hashcatでグラボをいじめる
これだけ.意外と簡単.
今回の環境.解析速度に関わるのは実質GPUのみだけど一応.
・win10 home
・Ryzen9 5900X
・RX 6800XT (ドライバ 22.5.1)
・メモリ48G
・WSL: Ubuntu18.04
Johnを動かすときにLinux環境のほうがちょっとだけ手間が省けたのでWSLを使った.必須ではない.
今回はCPUは解析に使わなかったが,使うのであれば"OpenCL Runtime for Intel Core and Intel Xeon Processors"の16.1.1以降を導入する必要がある.AMD製CPUであってもこれを使うらしい.
AMD製GPU環境に関してはwindowsであれば20.2.2以降のドライバ,LinuxであればROCmの3.1以降が必要とのこと.RDNA2はROCm v5.0以降でないと正式にはサポートしてないらしい(4.5でも一応動くらしい)(無知).
NVIDIA製GPU環境だと440.64以降のドライバと9.0以降のCUDA Toolkitが必要.
特に迷うことはなさげ.windows環境であればここからhashcat binariesをダウンロードして解凍するだけ.
今回はhashcat6.2.5を使った.
windows環境であれば "64-bit Windows binaries"をダウンロードして解凍すればよし.7zでもzipでもいいけどあまり速い回線ではなさそうだから7zのほうがいいかも.
今回はjohn-1.9.0-jumbo-1-win64を使った.
john-1.9.0-jumbo-1-win64/runに色々とプログラムが用意されている.今回はPDFをゴニョゴニョしたいからpdf2john.plを使う.とりあえず同じフォルダにに今回パスワードを解析したいPDFを配置.
私のwindowsにPerlの実行環境は用意していなかったし(.plはperlのスクリプトファイル),このためだけに準備するのも面倒だからWSLを使う.WSLで/mntを開くとwindows側のディレクトリを開くことができる.それでフォルダ開いて
perl pdf2john.pl MyPDF.pdf > MyPDF.pdf.txt
MyPDF.pdfには解析したいPDFファイル名を入れる.MyPDF.pdf.txtに抽出したハッシュが保存される.
このままhashcatに読ませるとエラーを返すのでMyPDF.pdf.txtを開いて冒頭の
MyPDF.pdf:$pdf$~
のうちMyPDF.pdf:を削除,つまりコロンまでを消す.消さないとhashcatが
Hashfile 'Mypdf.pdf.txt' on line 1 (MyPDF....): Signature unmatched
No hashes loaded.
ってエラーを吐く
これでハッシュの準備は完了.
ちなみにオンラインでPDFのハッシュを抜いてくれるサイトも存在している.今回は使わなかったがオンラインに投げてもいいようなPDFであれば使ってもいいかもしれない.
先ほど生成したMyPDF.pdf.txtをhashcatのフォルダに移動.そしたらWSLではなくwindows側でcmdを起動してhashcatのフォルダを開く.そして
hashcat.exe -m 10500 -a 3 Mypdf-Hash.txt
のような感じで実行.そして待つだけ.
実行が終わると
画像一番上行の
$pdf$4*4*128*-1060*1*16*1ecddfaccbcbd04d86df9af2c64e6165*32*0e339f51ae97d7418c5afc208760c74600000000000000000000000000000000*32*c431fab9cc5ef7b59c244b61b745f71ac5ba427b1b9102da468e77127f1e69d6:123456
のようにハッシュ値:パスワードの形で表示される.今回は123456がパスワード.
詳しいことはここ見て
以下なんとなく適当気味説明
PDF系に関しては
10400 | PDF 1.1 - 1.3 (Acrobat 2 - 4) | Document 10410 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #1 | Document 10420 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #2 | Document 10500 | PDF 1.4 - 1.6 (Acrobat 5 - 8) | Document 25400 | PDF 1.4 - 1.6 (Acrobat 5 - 8) - user and owner pass | Document 10600 | PDF 1.7 Level 3 (Acrobat 9) | Document 10700 | PDF 1.7 Level 8 (Acrobat 10 - 11) | Document
となっている.PDFのバージョンはPDFファイルをテキストエディタで開くと先頭に書かれているのでそれで判別可能.
たいていは10400,10500,10600,10700のどれかで対応できる.またAdobeによると,
とのことなのでハッシュ値の長さも手掛かりになる.ちなみにwordで作ったパスワード付きPDFはPDF1.5っぽいので10500でいける.
l | abcdefghijklmnopqrstuvwxyz [a-z] u | ABCDEFGHIJKLMNOPQRSTUVWXYZ [A-Z] d | 0123456789 [0-9] h | 0123456789abcdef [0-9a-f] H | 0123456789ABCDEF [0-9A-F] s | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ a | ?l?u?d?s b | 0x00 - 0xff
たとえば数字6桁を指定したければ「?d?d?d?d?d?d」となる.
アルファベット小文字5つ+数字3桁を指定したければ「?l?l?l?l?l?d?d?d」となる.
「アルファベット大文字+アルファベット小文字」とかそういうのを表現したいときはカスタムマスクの定義が必要.やり方は
-1 ?l?u
-1で1つめのカスタムマスクであることを示してそのあとに?l?uで「アルファベット大文字+アルファベット小文字」を表現.
「アルファベット大文字+アルファベット小文字+数字」であれば
-1 ?l?u?d
となる.使うときは
hashcat.exe -m 10500 -a 3 Mypdf-Hash.txt -1 ?l?u?d ?1?1?1?1
とかする.これで「アルファベット大文字+アルファベット小文字+数字」で4桁
例えば数字6桁を指定したければ
?d?d?d?d?d?d
数字1~6桁ならば
--increment ?d?d?d?d?d?d
数字3~6桁なら
--increment --increment-min 3 --increment-max 6 ?d?d?d?d?d?d
数字以外の文字種でも同様.
公式によると
0 | Straight 1 | Combination 3 | Brute-force 6 | Hybrid Wordlist + Mask 7 | Hybrid Mask + Wordlist 9 | Association
だそうです(無知).
指定した辞書ファイルを使ってアタック.辞書ファイルの単語をそのままぶつけて確認してるのかな?実行時は辞書ファイルを渡す必要がある.
例)hashcat.exe -m 10500 -a 0 Mypdf-Hash.txt dic.txt
辞書ファイル複数を組み合わせる.辞書ファイルとしてdic1.txtとdic2.txtがあってそれぞれ
dic1
dic2
があったときに
hashcat.exe -m 10500 -a 1 Mypdf-Hash.txt dic1.txt dic2.txt
とすると
で攻撃する.さらにそれぞれの辞書に追加でルールの適用が可能.-jで1番目の辞書に,-kで2番目の辞書にルールを適用する.単語は$で示す.例えば単語を「_」でつないで最後に「+」をつける場合は
hashcat.exe -m 10500 -a 1 -j $_ -k $+ Mypdf-Hash.txt dic1.txt dic2.txt
になる.このときの単語は
となる.
皆さんおなじみ総当たり検索.クッソ時間はかかるがそのうち正解にはたどり着ける.マスクとか使って多少絞り込まないと非現実的な時間がかかる.
辞書ファイルの単語+マスクで攻撃する.例えばdic1.txtが
だったときに
hashcat.exe -m 10500 -a 6 Mypdf-Hash.txt dic1.txt ?d?d?d?d
とすると
となる.
6の逆.
例えばdic1.txtが
だったときに
hashcat.exe -m 10500 -a 7 Mypdf-Hash.txt dic1.txt ?d?d?d?d
とすると
となる.
わかりません(正直).
# | Performance | Runtime | Power Consumption | Desktop Impact ===+=============+=========+===================+================= 1 | Low | 2 ms | Low | Minimal 2 | Default | 12 ms | Economic | Noticeable 3 | High | 96 ms | High | Unresponsive 4 | Nightmare | 480 ms | Insane | Headless
公式曰く↑らしい.雑に解釈すれば
1: 軽い
2: 普通
3: 重い
4: クソ重い
ってことか.思考停止で4を指定していいと思う.
hashcatの関連ツール.文字列の組み合わせを生成するためのツール.普通に
sudo apt install princeprocessor
でインストールできる.例えばdic1.txtが
だったときに
princeprocessor --elem-cnt-min=1 --elem-cnt-max=3 dic1.txt > dic2.txt
とすればdic2.txtは
といった感じで指定した個数の組すべてを生成する.ファイルに出力しないでパイプとかでhashcatに渡したほうがいいように思える.
このクソ暑い時期にグラボ全力Poweeeeeerrrrrr!!!したせいで室温が3℃も上がりました.提訴.
パスワード長くしていろんな文字種を混ぜるってのはすごーく有効だということが身をもって体感できた.うちのPCだと「アルファベット大文字+小文字+数字+記号」の8桁の時点で総当たりには5年かかるっぽい.辞書攻撃が可能だと桁数が意味をなさなくなるから「ランダムな文字列で大文字小文字数字記号を含む16桁」ぐらいあればまず解析されることはないんじゃないかなって.