LINUX.ORG.RU

Сообщения drjerk

 

Запуск полноценного ArchLinux без root прав на android

Навеяно вопросом mandala ниже
Все действия на ваш страх и риск

Немного теории
Есть такая библиотека ptrace.h
ptrace - тоже самое что strace, только позволяет изменять результат системных вызовов
Например подменив вызов getuid()/setuid() можно заставить приложение думать что оно запущено из под рута
Подменив fstat() можно изменить структуру файлов

proot
На этой библиотеке написана утиля proot.
proot умеет эмулировать chroot и mount --bind без root прав.

Где добыть ArchLinux под arm
Здесь - https://archlinuxarm.org/platforms/armv8/generic ,если у вас aarch64 (на нём тестировал)
Здесь - https://archlinuxarm.org ,если armv7

Исправляем проблемы архива
0) Для начала распакуем архив (на компьютере)
umask 022
mkdir arch
cd arch
sudo tar xvfp ~/Downloads/ArchLinux.tar.gz (важно это сделать из под рута)
1) Неправильные права директорий
Часть директорий связаных с openssl имеют права 555, и при распаковке под обычным пользователем, это приводит к ошибке.
chmod -R u+w ./arch
2) Жесткие ссылки
Не знаю зачем они нужны (если есть symlink), но android на «ln a b» выдает «permission denied»
Поэтому упаковываем с флагом "--hard-dereference"
sudo tar cvzfp arch.tar.gz --hard-dereference ./arch

Запускаем ArchLinux
Разумеется нам понадобится эмулятор терминала.
Лучше всего изпользовать Termux (бесплатный, OpenSource), так как в нем есть менеджер пакетов, и proot устанавливается очень просто.
1. (В termux)
termux-setup-storage (SD Карта)
pkg install proot
2. Копируем перепакованый arch.tar.gz на телефон (например используя netcat)
3. Распаковываем в ~/arch
umask 022 (В termux)
tar xvfp arch.tar.gz (В termux)
4. Пишем скрипт для запуска

#!/data/data/com.termux/files/usr/bin/bash

rootdir="/data/data/com.termux/files/home/arch" # /
tmp_prefix="/data/data/com.termux/files/usr/tmp" # здесь будут храниться временные файлы (/tmp, /run)

sid="${RANDOM}${RANDOM}${RANDOM}${RANDOM}" # mktemp -d для слабаков

run_bind="${tmp_prefix}/run${sid}" # /run
tmp_bind="${tmp_prefix}/tmp${sid}" # /tmp

resolv_conf="${run_bind}/resolv.conf" # список dns

mkdir "$tmp_bind"
chmod 777 "$tmp_bind"
mkdir "$run_bind"
chmod 777 "$run_bind"

for i in `seq 1 4`; do
    if [[ ! -z `getprop net.dns${i}` ]]; then
        echo nameserver `getprop net.dns${i}` >> "$resolv_conf"
    fi
done
# настроили dns
proot --link2symlink -0 -m "${run_bind}:/run" -m "${tmp_bind}:/tmp" -m /sdcard -m /dev -m /sys -m /proc -w / -r "${rootdir}" /bin/su - root # сам proot, флаг --link2symlink не документирован, но черезвычайно полезен

rm -rf "$run_bind" 
rm -rf "$tmp_bind" # Стираем временные файлы перед выходом

Настраиваем dns в ArchLinux
chmod +x ./arch.bash (В termux, arch.bash - скриптик выше)
./arch.bash (В termux)
rm /etc/resolv.conf (В ArchLinux)
ln -s /run/resolv.conf /etc/resolv.conf (В ArchLinux)

 

drjerk
()

Вопрос про «BTRFS snapshots»

Положим у меня есть длинная цепочка снапшотов 0 (ro) -> 1 (ro) -> 2 (ro) -> 3 (ro) -> 4 (ro) -> 5 (rw) И я хочу удалить старые данные ничего не поменяв в 5 снапшоте Какие из снапшотов можно удалить (btrfs subvolume delete)?

 ,

drjerk
()

Как использовать tor «Правильно» или свой torify на setgid

Просьба ногами не бить нигде не нашел похожего метода или утили

Всё на ваш страх и риск

Трафик на тор перенаправляем при помощи iptables Правила взял отсюда https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy Сделал фильтр по пользователям (убрал всю не OUTPUT цепочку к оставшимся правилам добавил фильтр по GID или UID на выбор) Получившийся скрипт

#!/bin/bash
#iptables_torify.bash

dns_port=9053
tor_port=9040
virt_addr="10.192.0.0/10"
non_tor="127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 0.0.0.0/8 100.64.0.0/10 169.254.0.0/16 192.0.0.0/24 192.0.2.0/24 192.88.99.0/24 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 224.0.0.0/3"

RED='\033[0;31m'
NC='\033[0m'

if [[ "$UID" != "0" ]]; then
    echo -e "${RED}Нужен root!${NC}"
    exit 1
fi

if [[ "$1" == "add" ]]; then
    op="-A"
elif [[ "$1" == "del" ]]; then
    op="-D"
else
    echo -e "${RED}Неизвестная операция '$1'${NC}"
    exit 1
fi

if [[ "$2" == "uid" ]]; then
    if [[ ! "$3" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}Неверный UID '$3'${NC}"
        exit 1
    fi
    filter="--uid-owner"
    owner="$3"
elif [[ "$2" == "gid" ]]; then
    if [[ ! "$3" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}Неверный GID '$3'${NC}"
        exit 1
    fi
    filter="--gid-owner"
    owner="$3"
elif [[ "$2" == "user" ]]; then
    owner=`id -u "$3" 2>/dev/null`
    if [[ ! "$owner" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}Пользователь '$3' не существует${NC}"
        exit 1
    fi
    filter="--uid-owner"
elif [[ "$2" == "group" ]]; then
    owner=`id -g "$3" 2>/dev/null`
    if [[ ! "$owner" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}Пользователь '$3' не существует${NC}"
        exit 1
    fi
    filter="--gid-owner"
else
    echo -e "${RED}Неизвестный фильтр '$2'${NC}"
    exit 1
fi

iptables -t nat "$op" OUTPUT -d "$virt_addr" -p tcp -m tcp -m owner "$filter" "$owner" --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports "$tor_port"
iptables -t nat "$op" OUTPUT -p udp -m udp -m owner "$filter" "$owner" --dport 53 -j REDIRECT --to-ports "$dns_port"
for lan in $non_tor; do
    iptables -t nat "$op" OUTPUT -m owner "$filter" "$owner" -d "$lan" -j RETURN
done
iptables -t nat "$op" OUTPUT -m owner "$filter" "$owner" -o lo -j RETURN
iptables -t nat "$op" OUTPUT -p tcp -m tcp -m owner "$filter" "$owner" --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports "$tor_port"

iptables "$op" OUTPUT -m owner "$filter" "$owner" -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j ACCEPT
for lan in $non_tor; do
    iptables "$op" OUTPUT -m owner "$filter" "$owner" -d "$lan" -j ACCEPT
done
iptables "$op" OUTPUT -m owner "$filter" "$owner" -d 127.0.0.1/32 -o lo -j ACCEPT
iptables "$op" OUTPUT -m owner "$filter" "$owner" -d 127.0.0.1/32 -p tcp -m tcp --dport "$tor_port" --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
iptables "$op" OUTPUT -m owner "$filter" "$owner" -d 127.0.0.1/32 -p udp -m udp --dport "$dns_port" -j ACCEPT
iptables "$op" OUTPUT -m owner "$filter" "$owner" -j DROP
Например sudo iptables_torify.bash add group torify перенаправит трафик всех пользователей с основной группой torify на tor sudo iptables_torify.bash add user myname весь трафик пользователя myname на tor
#/etc/tor/torrc
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 9040
DNSPort 9053
Настраиваем пользователя torify
su
useradd torify -m
iptables_torify.bash add group torify
iptables-save >> "/etc/iptables/iptables.rules"
systemctl enable iptables.service
systemctl enable tor
reboot
Залогинившись torify'ем весь наш трафик идет через тор и мы этому (без root) не можем воспрепятствовать (уже хорошо), но хотелось бы без лишних нажатий на клавиатуру Пишем небольшой SUID скрипт на C меняющий GID текущего пользователя на GID пользователя «torify» и запускающий что ему сказали (по аналогии с sudo)
#setgid_torify.cpp
#include <cstdlib>
#include <unistd.h>
#include <string>
#include <cstring>
#include <cassert>
#include <cstdio>

using namespace std;

string e(const char *s) {
    string res;
    for (size_t i = 0, l = strlen(s); i < l; ++i) {
        if(s[i] == '\'') res += "'\\''";
        else res.push_back(s[i]);
    }
    return res;
}

uint32_t id(const char *s) {
    FILE *p = popen(s, "r");
    assert(p);
    char ch;
    uint32_t i = 0;
    do {
        ch = fgetc(p);
        if (ch >= '0' && ch <= '9') i = i * 10 + (ch - '0');
    } while(ch != EOF);
    pclose(p);
    assert(i != 0);
    return i;
}

int main(int argc, const char *argv[]) {
    string s;
    for (int i = 1; i < argc; ++i) {
        s.push_back('\'');
        s += e(argv[i]);
        s.push_back('\'');
        if (i + 1 < argc) s.push_back(' ');
    }
    uint32_t torify_gid = id("id -g torify");
    setgid(torify_gid);
    setuid(getuid());
    if (getgid() == torify_gid)
        return system(s.c_str());
    else
        printf("setgid_torify: failed to setgid\n");
    return 1;
}
g++ setgid_torify.cpp -o setgid_torify -O2 -Wall
sudo chown root:root setgid_torify
sudo chmod 4755 setgid_torify
# Если кто не умеет
Итог (теория) setgid_torify chromium --incognito запускает chromium весь tcp и dns трафик которого идет через tor, весь остальной «дропается» Итог (практика) заходим на browserleaks.com несмотря на то что flash полностью рабочий, «flash leak» не определяет наш настоящий ip (пишет торовский), webrtc leak аналогично

 

drjerk
()

RSS подписка на новые темы