2009-07-04:

Losowe przemyślenia, odsłona druga

php:c:c++:funny:security:malware:windows
Z powodów różnych na moim blogu kapkę cicho się zrobiło ostatnio, ale zapewniam że to przejściowe. Niemniej jednak czas zacząć nadrabiać zaległości, i napisać o tym i owym.

Na początku małe ogłoszenie: ReverseCraft #3 pojawi się na sieci dopiero na początku następnego tygodnia (czyli za 2-3 dni) - niestety w czwartek/piątek (kiedy to miałem nagrywać kolejny eps) wystąpiły pewne komplikacje i epsa nagrać się nie udało.

A teraz czas na temat właściwy postu, czyli losowe przemyślenia...

PHP jako preprocesor nie tylko do HTML'a
Na pewnym forum rozwinęła się dyskusja na temat mieszania kodu w różnych językach w jednym źródle - autor na początku tematu posłużył się (celowo) pewnym uproszczeniem pisząc:
Pisząc kod programu nie możemy korzystać z instrukcji kilku języków programowania ze sobą nie kompatybilnych [...]
W odpowiedzi padły m.in. stwierdzenia że przecież można łączyć C z assemblerem, czy PHP z HTML (pomińmy kwestię że HTML nie jest językiem programowania). Przeczytawszy to ostatnio przyszedł mi do głowy pewien dziwny pomysł - przecież PHP można łączyć nie tylko z HTML czy JS, ale również z Pythonem, C, assemblerem, czy innymi językami!
Całość opiera się o pewną wyjątkową cechę języka PHP - interpreter PHP wykonuje jedynie kod który jest między tagami <?php a ?>, dzięki czemu bez żadnych problemów możemy włączyć PHP w cokolwiek, i wykorzystać go jako bardziej potężną wersję preprocesora.
Przykładowe użycie mogło by wyglądać tak:

// PHP preprocesor test
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

float fast_sin(int deg)
{
 static const float sin_table[] = {
 <?php
   for($i = 0; $i < 359; $i++)
     echo(sin($i) . ", ");
   echo(sin($i));
 ?>
 };

 return sin_table[deg % 360];
}  

int
main(void)
{
 int i;
 srand(time(NULL));
 i = rand();
 printf("Czy wiesz ze sin(%i) = %f?\n", i, fast_sin(i));  

 return 0;
}


Kompilacja i użycie takiego tworu natomiast wygląda następująco (jak widać wymagany jest CLI do PHP):

$ php my.c | gcc -x c -
$ ./a.out
Czy wiesz ze sin(802194582) = 0.994827?
$


Krótkie wyjaśnienie opcji gcc: opcja -x c wybiera język - jest to wymagany parametr przy odczycie z stdin, a ów minus, będący drugą i ostatnią opcją, mówi kompilatorowi że ma czytać kod z stdin.

Czy to się może komuś do czegoś przydać? W dużych projektach na pewno nie - użycie w dużym projekcie tego typu trików jest bliskie masochizmu. Małe projekty, a w szczególności różnej maści hacki to inna sprawa - tam mamy pole do popisu i możemy z takich cudów korzystać. Szczególnie przydatne jest to w przypadku języków w których wybitnie preprocesor by się przydał, ale go nie ma.

Przeciwieństwo cyfrowych paranoików
Były już karteczki z hasłem na monitorze i pod klawiaturą, był już pan który zapisał PIN do karty flamastrem na bankomacie, przyszła więc i pora na producenta routerów który umieścił hasło w takim miejscu by nikt nie miał problemów ze znalezieniem go (klik to zoom, fota by Samlis Coldwind):

HTTP Auth: Resource: admin/1234


Gdyby tylko jeszcze admin pomyślał o zmianie hasła, lub choćby nazwy tego 'zasobu'...

hosts, malware, i prawa dostępu
Pisałem ostatnio m.in. o trojanach których zasada działania opiera się o dodanie paru(nastu/dziesięciu) wpisów do pliku C:\Windows\system32\drivers\etc\hosts (który to działa jak "lokalny DNS" dla podanych tam domen). Przyszła mi do głowy pewna rzeczy - a czemu by po prostu nie odebrać praw do zapisu do tego plik wszystkim userom - a w zasadzie wszystkim adminom, bo zwykli userzy nie mają write-access do tego pliku i tak i tak. Proste polecenie typu (uwaga: nie odpalaj tego polecenia jeśli nie wiesz co robisz):

cacls c:\windows\system32\drivers\etc\hosts /g Everyone:R

I po kłopocie. Chociaż jeszcze lepszym pomysłem było by Deny Write dla wszystkich.
Oczywiście, autor malware'u prędzej czy później może dopisać odzyskiwanie praw do zapisu do tego pliku, i wtedy wracamy do punktu wyjścia - tak więc jest to rozwiązanie jedynie tymczasowe, i będzie skuteczne tak długo jak nikt o nim (z twórców malware'u ofc) nie będzie wiedzieć - czyli mniej więcej do opublikowania tego postu w języku angielskim. Lepiej więc się spieszyć ze zmianą praw, przynajmniej jedną czy dwie noce prześpimy spokojnie ;)

No i na dzisiaj tyle... Zrobiło się późno, czas iść spać...

By the way...
On 22nd Nov'24 we're running a webinar called "CVEs of SSH" – it's free, but requires sign up: https://hexarcana.ch/workshops/cves-of-ssh (Dan from HexArcana is the speaker).

Comments:

2009-07-05 11:56:26 = ktos
{
Ciekawy pomysł z tym PHP :) bardzo ciekawy muszę się pobawić ;)
}
2009-07-05 17:21:33 = Patrykuss
{
IMO całkiem przyzwoitym rozwiązaniem "na chwilę" byłoby napisanie softu, który na podstawie shitlisty, sprawdzałby zawartość pliku hosts. Całość odpalana na prawach administratora, która po zakończeniu pracy po starcie systemu, ustalałaby na nowo uprawnienia do zapisu. Tak, wiem. Rozumowanie trochę dziwne ale IMO całkiem dobre na te "jedną czy dwie noce" ;).
}
2009-07-05 19:56:19 = Gynvael Coldwind
{
@ktos
Jak byś jakieś fajne zastosowanie wymyślił to się pochwal, k ? ;>

@Patrykuss
Pomysł ciekawy, przy czym sądzę że zastosowanie whitelisty zamiast blacklisty dało by lepszy rezultat ;>
Przy czym sądzę że zamiast pisać soft, można by wykorzystać mechanizm audytowania/inspekcji (ten wbudowany w Windows), i ustawić logowanie na dostęp z zapisem do hosts, i ustawić w obsłudze eventów pokazanie się jakiegoś komunikatu który by od razu usera poinformował co się dzieje ;>
}
2009-07-05 20:00:14 = Patrykuss
{
Whitelista raczej odpada, ponieważ "dobrych" przekierowań jest baaardzo dużo. Lepiej zrobić blacklistę, na której znajdą się wpisy phishingowe. Tak przynajmniej mi się zdaje.
}
2009-07-05 21:01:42 = Yarek
{
Z tym PeHaPem niezły trick ;)
Hmm jakby to teraz z Javą zbindować? ;]

ps. Czekamy na nowego ReverseCrafta - do roboty :)
}
2009-07-06 00:17:09 = Dabroz
{
Z tym "admin/1234" to chyba standard, mój Edimax też wesoło prosi (a raczej prosił) o zalogowanie "Log in, default = admin/1234" :)
}
2009-07-06 16:00:07 = Gynvael Coldwind
{
@Patrykuss
Wszystko zależy od tego jak bardzo korzysta się z tego pliku - czasem wystarczy na whitelist umieścić tylko localhost ;>
Ale w sumie wszystko i tak sprowadza się do kontroli nad nieautoryzowanym dostępem do pliku hosts...
Hmmm... przyszedł mi do głowy pewien pomysł... Hmm, ale muszę się nad tym zastanowić...

@Yarek
Z javą ? Sądzę żę da sie bez większych problemów. W sumie do Javy się całkiem nieźle cpp sprawdza (C/C++ preoprocessor, ten z pakietu GCC), więc czemu i PHP miałoby się nie sprawdzić ;>

@Dabroz
Ano właśnie, to jest charakterystyczna cecha pewnej grupy produktów Edimaxu - monit z fotki również pochodzi z Edimax'a... :)


}

Add a comment:

Nick:
URL (optional):
Math captcha: 1 ∗ 2 + 4 =