awd の主要な問題タイプは WEB と PWN で、使用される言語は主に PHP で、少量の Java や Python も含まれます。
WEB は主に CMS やフレームワークのセキュリティ脆弱性、例えば注入、アップロード、逆シリアル化などで、既知の脆弱性に依存することが多いです。
コンペティションの流れ#
一般的に、コンペティションは強化段階と攻撃段階を分けて行い、最初に統一して強化した後に攻撃を行います。
コンペティションが始まるとアカウントが表示されます。
bugku プラットフォーム、例えば team1 のパスワードは fe85d7dec6e3757f391e013efdd67c0c、ポートは 2222 で、一般的なサーバーは Linux システムです。ログインツールには xSHELL や finalSHELL などを使用できます。
Token は主にスクリプトの身分証明書として自動化された提出の認証に使用されます。仮想 IP はターゲットマシンのアクセス URL です。他の選手のアドレスは 192-168-x-250.pvp1923.bugku.cn で、x は 1-255 の任意の数字です。
サイトソースコードのバックアップ#
ソースコードのバックアップには Winscpまたは
FileZilla` を使用できますが、ダウンロードは遅くなる可能性があります。
速い方法は直接tar
でパッケージ化することです。
tar
バックアップ方法は以下の通りです:
cd /var/www/html
tar -zcvf ~/html.tar.gz *
データベースのバックアップ#
時々、データベースにもフラグがあるため、データベースもバックアップしておく必要があります。削除されるのを避けるためです。
まずは設定ファイルを探し、アカウントとパスワードを確認します。
cd /var/www/html
find .|xargs grep "password"
バックアップ:
$ cd /var/lib/mysql #(MySQLのディレクトリに移動し、自分のMySQLのインストール状況に応じてディレクトリを調整)
$ mysqldump -u root -p Test > Test.sql # パスワードを入力します。
$ mysqldump -u root -p --all-databases > ~/backup.sql # すべてのデータベースをバックアップ
$ mysqldump -u root -p --all-databases --skip-lock-tables > ~/backup.sql # ロックされたデータベーステーブルをスキップ
データベースのパスワード変更#
一般的に、データベースのパスワードは必ず変更する必要があります。
$ mysql -u root -p
show databases;
use mysql
set password for root@localhost = password('123');
トラフィック監視#
トラフィック監視スクリプト。他の人があなたを攻撃した後、訪問情報、URL を記録し、それを使って他の人を攻撃することができます。
<?php
$ip = $_SERVER["REMOTE_ADDR"]; //訪問者のIPを記録
$filename = $_SERVER['PHP_SELF']; //訪問者がアクセスしようとしているファイル名
$parameter = $_SERVER["QUERY_STRING"]; //訪問者が要求しているパラメータ
$method = $_SERVER['REQUEST_METHOD']; //要求方法
$uri = $_SERVER['REQUEST_URI']; //要求URI
$time = date('Y-m-d H:i:s',time()); //訪問時間
$post = file_get_contents("php://input",'r'); //POSTデータを受信
$others = '...他に知りたい情報...';
$logadd = 'Visit Time:'.$time.' '.'Visit IP:'.$ip."\r\n".'RequestURI:'.$uri.' '.$parameter.'RequestMethod:'.$method."\r\n";
// log記録
$fh = fopen("/tmp/log.txt", "a+");
fwrite($fh, $logadd);
fwrite($fh, print_r($_COOKIE, true)."\r\n");
fwrite($fh, $post."\r\n");
fwrite($fh, $others."\r\n");
fclose($fh);
?>
このようなスクリプトは一般的に CMS のエントリファイルに配置されます。
ファイル監視#
# -*- coding: utf-8 -*-#
# awdファイル監視スクリプト
import os
import json
import time
import hashlib
def ListDir(path): # ウェブサイトのすべてのファイルを取得
for file in os.listdir(path):
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
if initialization['ok'] == 'false':
dir_list.append(file_path)
else:
dir_list_tmp.append(file_path)
ListDir(file_path)
else:
if initialization['ok'] == 'false':
file_list.append(file_path)
else:
file_list_tmp.append(file_path)
def GetHash(): # ハッシュを取得し、インデックスを作成
for bak in file_list:
with open(bak, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
bak_dict[bak] = hash
if os.path.exists('/tmp/awd_web_hash.txt') == False:
os.system('mkdir /tmp/awd_web_bak/')
os.system('\\cp -a {0}* /tmp/awd_web_bak/'.format(web_dir))
with open('/tmp/awd_web_hash.txt', 'w') as f: # webファイルのハッシュを記録
f.write(str(json.dumps(bak_dict)))
for i in file_list: # webファイルリストを記録
with open('/tmp/awd_web_list.txt', 'a') as f:
f.write(i + '\n')
for i in dir_list: # webディレクトリリストを記録
with open('/tmp/awd_web_dir.txt', 'a') as f:
f.write(i + '\n')
def FileMonitor(): # ファイル監視
# 現在のwebディレクトリの状態を抽出
initialization['ok'] = 'true'
for file in os.listdir(web_dir):
file_path = os.path.join(web_dir, file)
if os.path.isdir(file_path):
dir_list_tmp.append(file_path)
ListDir(file_path)
else:
file_list_tmp.append(file_path)
for file in file_list_tmp:
with open(file, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
bak_dict_tmp[file] = hash
with open('/tmp/awd_web_hash.txt', 'r') as f: # バックアップされたファイルのハッシュを読み込む
real_bak_dict = json.loads(f.read())
with open('/tmp/awd_web_list.txt', 'r') as f: # バックアップされたファイルリストを読み込む
real_file_list = f.read().split('\n')[0:-1]
with open('/tmp/awd_web_dir.txt', 'r') as f: # バックアップされたディレクトリリストを読み込む
real_dir_list = f.read().split('\n')[0:-1]
for dir in real_dir_list: # webディレクトリを復元
try:
os.makedirs(dir)
print("[del-recover]dir:{}".format(dir))
except:
pass
for file in file_list_tmp:
try:
if real_bak_dict[file] != bak_dict_tmp[file]: # 改ざんされたファイルを検出し、自動的に復元
os.system('\\cp {0} {1}'.format(file.replace(web_dir, '/tmp/awd_web_bak/'), file))
print("[modify-recover]file:{}".format(file))
except: # 新しく追加されたファイルを検出し、自動的に削除
os.system('rm -rf {0}'.format(file))
print("[delete]webshell:{0}".format(file))
for real_file in real_file_list: # 削除されたファイルを検出し、自動的に復元
if real_file not in file_list_tmp:
os.system('\\cp {0} {1}'.format(real_file.replace(web_dir, '/tmp/awd_web_bak/'), real_file))
print("[del-recover]file:{0}".format(real_file))
file_list_tmp[:] = []
dir_list_tmp[:] = []
os.system("rm -rf /tmp/awd_web_hash.txt /tmp/awd_web_list.txt /tmp/awd_web_dir.txt /tmp/awd_web_bak/")
web_dir = "/var/www/" # webディレクトリ、最後にスラッシュを追加することに注意
file_list = []
dir_list = []
bak_dict = {}
file_list_tmp = []
dir_list_tmp = []
bak_dict_tmp = {}
initialization = {'ok': 'false'}
ListDir(web_dir)
GetHash()
while True:
print(time.ctime()+" 安全")
FileMonitor()
time.sleep(1) # 監視間隔、必要に応じて変更
ホスト検出#
nmap や httpscan(自分のホスト側)を使用できます。
ローカル python スキャン
import requests
for i in range(1, 255):
try:
url = 'http://192-168-1-{}.pvp2012.bugku.cn/'.format(i)
response = requests.get(url,headers={'Connection':'close'})
print(response)
if response.status_code == 200:
print(url)
else:
pass
except requests.exceptions.RequestException as e:
print(f"{url} is down. Error")
# http://192-168-1-100.pvp2012.bugku.cn/
脆弱性スキャン#
D 盾スキャンでダウンロードした cms ソースコードの脆弱性、または cms 情報に基づいてオンラインで脆弱性を検索します。
waf のインストール#
もし web ディレクトリのファイルにカスタム waf スクリプトを追加したい場合、実際には 1 つのコマンドで解決できます。php の例:
find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?php require_once('\/tmp\/waf.php');/g"
find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?php require_once('waf.php');/g"
バックドアの駆除#
コマンドを使用して疑わしいファイルを確認します:
find /var/www/html -name *.php -mmin -20 #最近20分間に変更されたファイルを確認
find ./ -name '*.php' | xargs wc -l | sort -u #行数が最も短いファイルを探す
grep -r --include=*.php '[^a-z]eval($_POST' /var/www/html #キーワードを含むphpファイルを検索
find /var/www/html -type f -name "*.php" | xargs grep "eval(" |more
フォーク爆弾#
:(){ :|:& };:
bash に入力すると、再帰的に子プロセスを作成し、その結果、サーバーリソースが枯渇し、サーバーが正常に外部サービスを提供できなくなります。