Zmasowany atak scammerów

https://xpil.eu/IMMRS

Ze scammerami się lubimy, i to bardzo. Z tym, że jednostronnie. Ja ich lubię, oni mnie nie znoszą, ponieważ hołduję zasadzie, że jak już uda mi się odebrać od takiego połączenie i akurat mam chwilę, to staram się delikwenta przetrzymać na telefonie najdłużej jak się da. Mój rekord to okolice 40 minut (gość udawał agenta odpowiednika lokalnej Skarbówki), zaraz za nim na drugim miejscu koleś próbujący sprzedać mi Bitcoiny. W obydwu przypadkach doprowadziłem rozmówcę do niekontrolowanego ataku śmiechu, co uważam prywatnie za sukces. Ostatnio jednak albo ja się zestarzałem i mi inteligencja zwiędła, albo chłopaki się wycwaniły - już od dawna nie udało mi się przeskoczyć progu trzech minut.

No ale, do rzeczy.

Kilka dni temu z jakiegoś tajemniczego powodu zacząłem nagle otrzymywać nie, jak dotychczas, jeden czy dwa takie telefony tygodniowo, ale *kilkanaście dziennie*. Wszystkie z numerów z UK i - żeby było ciekawiej - każdy z innego numeru.

Połączenia są zautomatyzowane: najpierw robot objaśnia, że (A) mój numer telefonu zostanie wyłączony w ciągu najbliższych 2 godzin, lub (B) mój lekarz pierwszego kontaktu próbuje się ze mną skontaktować (klasyczna strategia stworzenia wrażenia pośpiechu i pilności). Następnie mogę wybrać jeden albo dwa w zależności od tego, czy chcę rozmawiać po angielsku czy po chińsku. No i teraz tak: jeżeli wybiorę jedynkę, zgłasza się rozmówca chińskojęzyczny, natomiast jeżeli wcisnę 2 - dla odmiany również Chińczyk. I to taki, który po angielsku ani be, ani me, ani kukuryku. Próbowałem też wciskać różne inne numery - zawsze to samo, coś tam do mnie gadają po mandaryńsku, a moje próby zagadania mową Yeats'a kończą się natychmiastowym rozłączeniem.

Póki co wywnioskowałem - z grubsza - że:

  1. Raczej nie jestem celem tego ataku - prawdopodobnie mój numer wyciekł gdzieś, kiedyś, jako jeden z wielu tysięcy.
  2. Atakujący targetują chińskich obywateli w Irlandii - inaczej nie dawaliby do "obsługi" osób niemówiących po angielsku.

Z tego wynika, że nie mam się czym martwić ze strony bezpieczeństwa - to znaczy, źle mówię. Nie powinienem się martwić bezpieczeństwem bardziej niż zwykle 🙂 Ostrożności nigdy za wiele.

Natomiast jak mawiają mądrzy ludzie z każdej sytuacji można wyciągnąć jakąś lekcję. Tu na przykład dowiedziałem się w jaki sposób wydobyć z telefonu listę połączeń. Podzielę się tą informacją, ponieważ {tu wstaw imię swojej ulubionej personifikacji siły wyższej} kazał się dzielić. A także, bo lubię.

Zaczynamy od zainstalowania na swoim komputerze aplikacji adb...

Jak? Proszę sobie poguglać, ja zrobiłem: sudo apt install google-android-platform-tools-installer ale to już jak Marysia lubi.

... następnie podłącza się smartfona kabelkiem usb to komputera, trzeba w ustawieniach zezwolić na "debugowanie USB", potem komenda adb devices, trzeba jeszcze dźgnąć paluchem w ekranik, że się zgadzamy na połączenie - i teraz:

adb shell content query --uri content://call_log/calls

W efekcie zobaczymy na ekranie pierdylion informacji o wszystkich naszych wykonanych, odebranych i odrzuconych połączeniach od początku świata.

No a skoro tak, to już powinno pójść całkiem prosto żeby się tymi danymi jakoś pobawić:

import subprocess
import re
from datetime import datetime
from collections import Counter
import matplotlib.pyplot as plt

def get_call_log():
    result = subprocess.run(
        ["adb", "shell", "content", "query", "--uri", "content://call_log/calls"],
        stdout=subprocess.PIPE,
        text=True
    )
    return result.stdout

def parse_entries(raw_data):
    dates = []
    for row in raw_data.split("Row:")[1:]:
        entry = {}
        for match in re.finditer(r"(\w+)=([^,]*)", row):
            key, value = match.groups()
            entry[key] = value.strip()
        number = entry.get('number', '')
        if number.startswith('+44'):
            try:
                timestamp = datetime.fromtimestamp(int(entry['date']) / 1000)
                date_str = timestamp.date().isoformat()
                dates.append(date_str)
            except:
                continue
    return dates

def plot_call_frequency(dates):
    counter = Counter(dates)
    sorted_dates = sorted(counter.items())
    x = [date for date, _ in sorted_dates]
    y = [count for _, count in sorted_dates]

    plt.figure()
    plt.plot(x, y)
    plt.xticks(rotation=45)
    plt.title("UK Scam Calls Over Time")
    plt.xlabel("Date")
    plt.ylabel("Number of Calls")
    plt.tight_layout()
    plt.grid(True)
    plt.savefig("scam_calls.png")

if __name__ == "__main__":
    raw = get_call_log()
    dates = parse_entries(raw)
    print(dates)
    plot_call_frequency(dates)

W efekcie dostaniemy całkiem nudny wykres, o taki o:

Jak widać od października 2013 roku do trzy dni temu moje połączenia z UK były bardzo sporadyczne. Od trzech dni jednak - jak widać - dzwonią cały czas. Przedwczoraj 20 połączeń, wczoraj "tylko" 6, dzisiaj już 19 (a godzina jeszcze młoda, może dobije do 20).

Sprawdziłem też sobie dla pewności, czy faktycznie scammerzy dzwonią za każdym razem z innego numeru:

import subprocess
import re
from datetime import datetime
from collections import defaultdict

def get_call_log():
    result = subprocess.run(
        ["adb", "shell", "content", "query", "--uri", "content://call_log/calls"],
        stdout=subprocess.PIPE,
        text=True
    )
    return result.stdout

def summarize_uk_calls(raw_data):
    call_data = defaultdict(list)
    for row in raw_data.split("Row:")[1:]:
        match = re.search(r"number=(\+44\d+).*?date=(\d+)", row)
        if match:
            number = match.group(1)
            date_epoch = int(match.group(2))
            call_data[number].append(date_epoch)
    summary = []
    for number, dates in call_data.items():
        count = len(dates)
        date_min = datetime.fromtimestamp(min(dates) / 1000).strftime('%Y-%m-%d %H:%M:%S')
        date_max = datetime.fromtimestamp(max(dates) / 1000).strftime('%Y-%m-%d %H:%M:%S')
        summary.append((number, count, date_min, date_max))

    summary_sorted = sorted(summary, key=lambda x: x[1], reverse=True)
    return summary_sorted

if __name__ == "__main__":
    raw = get_call_log()
    results = summarize_uk_calls(raw)
    print("Phone Number | Count | Earliest Call | Latest Call")
    for number, count, date_min, date_max in results:
        print(f"{number} | {count} | {date_min} | {date_max}")

... i się okazało, że owszem. Mają, dranie, pulę numerów i rotują, żeby obchodzić blokady i inne narzędzia pomagające w walce z telefonicznym spamem.

Chwilowo obserwuję to zjawisko z chłodnym dystansem. Jak się już zacznie przeciągać na tygodnie, może pomyślę o złożeniu skargi do ComReg (chociaż pewnie i tak niewiele zrobią, bo dzwoniący są zagramaniczni).

Pożyjemy - zobaczymy...

https://xpil.eu/IMMRS

1 Comment

  1. A nie możesz złożyć skargi do odpowiednika ComReg w UK?

    Albo do ComReg i wskazać, iż jeśli to jest poza ich zakresem to by przekazali do UK?

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.